在 C# 里用 [DllImport("SgCamWrapper.dll")] 去调用非托管 DLL 时,很多同学最常踩的坑就是——DLL 到底该放哪?其实 .NET 的查找顺序有一套明确的规则,搞懂了这一步,以后遇到 DllNotFoundException 就不会一脸懵了。

✅ .NET 查找 DLL 的路径顺序

优先级从高到低是这样的:

✅ 如何确保它能找到 DLL?

三个办法,按推荐程度排序:

方法 1:把 SgCamWrapper.dll 放到可执行文件旁边
最简单粗暴,也最不容易出问题。如果你在用 Visual Studio,直接把 DLL 拷贝到 bin\Debugbin\Release 目录下:

YourProject/
│
├── bin/
│   └── Debug/
│       ├── YourApp.exe
│       ├── CameraWrapper.dll
│       └── SgCamWrapper.dll   <-- 放这里!

方法 2:项目中设置“始终复制”到输出目录
把 DLL 添加到项目里,右键 → 属性 → 复制到输出目录 设为“始终复制”或“如果较新则复制”。这样每次编译都会自动把它带到输出文件夹,省心不少。

方法 3:在代码中动态指定路径
如果 DLL 的存放位置比较特殊(比如放在某个子目录或者配置文件里指定),你可以先用 LoadLibrary 手动加载,再调用封装好的 CameraWrapper

[DllImport("kernel32", SetLastError = true)]
private static extern IntPtr LoadLibrary(string lpFileName);

LoadLibrary("C:\\Path\\To\\SgCamWrapper.dll");

⚠️ 注意事项

ℹ️ 如何调试 DLL 加载失败?

加个简单的异常捕获,就能快速定位问题:

try
{
    CameraWrapper.SgCreateCamera();
}
catch (DllNotFoundException e)
{
    Console.WriteLine("DLL not found: " + e.Message);
}

如果还查不出原因,可以用工具(比如 dumpbin /headers 或 Visual Studio 自带的 CorFlags.exe)来确认 DLL 是 32 位还是 64 位。这一步搞清楚了,后面就好办了。

本文转载于:https://www.jb51.net/aspnet/342678ocv.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。