张乐文 發表於 2025-6-1 16:54:41

.NET 查找 DLL 路径顺序的问题小结

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">✅ .NET 查找 DLL 的路径顺序:</a></li><li><a href="#_label1">✅ 如何确保它能找到 DLL?</a></li><li><a href="#_label2">⚠️ 注意事项</a></li><li><a href="#_label3">ℹ️ 如何调试 DLL 加载失败?</a></li></ul></div><p>在 C# 中,<code></code> 这行代码表明它会在运行时从<strong>当前可执行文件的搜索路径</strong>中查找 <code>SgCamWrapper.dll</code>。具体搜索顺序如下(按优先级):</p>
<p class="maodian"><a name="_label0"></a></p><h2>✅ .NET 查找 DLL 的路径顺序:</h2>
<p><strong>应用程序启动目录(当前工作目录)</strong></p>
<ul><li>就是 <code>YourApp.exe</code> 所在的文件夹。</li><li>最常见的方式是直接将 <code>SgCamWrapper.dll</code> 放在你编译好的 <code>.exe</code> 或 <code>.dll</code> 旁边。</li></ul>
<p>系统目录(如 <code>C:\Windows\System32</code>)</p>
<p><strong>环境变量 PATH 中列出的目录</strong></p>
<p><strong>GAC(全局程序集缓存)</strong>(只对托管 DLL)</p>
<p class="maodian"><a name="_label1"></a></p><h2>✅ 如何确保它能找到 DLL?</h2>
<p>你有以下几种做法:</p>
<p>✅ 方法 1:把 <code>SgCamWrapper.dll</code> 放到可执行文件旁边</p>
<p>如果你在用 Visual Studio,可以将 DLL 拷贝到输出目录(<code>bin\Debug</code> 或 <code>bin\Release</code>):</p>
<div class="jb51code"><pre class="brush:plain;">YourProject/

├── bin/
│   └── Debug/
│       ├── YourApp.exe
│       ├── CameraWrapper.dll
│       └── SgCamWrapper.dll   &lt;-- 放这里!</pre></div>
<p>✅ 方法 2:项目中设置&ldquo;始终复制&rdquo;到输出目录</p>
<p>你可以把 DLL 添加到项目中并设置:</p>
<p>右键 DLL &rarr; 属性 &rarr; <strong>复制到输出目录</strong> &rarr; 设置为 &ldquo;始终复制&rdquo; 或 &ldquo;如果较新则复制&rdquo;。 ✅ 方法 3:在代码中动态指定路径</p>
<p>如果你想手动加载 DLL(例如从某个指定路径),可以用:</p>
<div class="jb51code"><pre class="brush:csharp;">
private static extern IntPtr LoadLibrary(string lpFileName);
LoadLibrary("C:\\Path\\To\\SgCamWrapper.dll");</pre></div>
<p>然后再调用你封装好的 <code>CameraWrapper</code>。</p>
<p class="maodian"><a name="_label2"></a></p><h2>⚠️ 注意事项</h2>
<ul><li>如果 <code>SgCamWrapper.dll</code> 依赖其他 DLL(比如 C++ 库),它们也必须能被找到。</li><li>如果你看到 <code>DllNotFoundException</code> 或 <code>BadImageFormatException</code>,很可能是 DLL 路径错误或平台不匹配(32 位 vs 64 位)。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>ℹ️ 如何调试 DLL 加载失败?</h2>
<p>你可以在项目中加个异常输出:</p>
<div class="jb51code"><pre class="brush:csharp;">try
{
    CameraWrapper.SgCreateCamera();
}
catch (DllNotFoundException e)
{
    Console.WriteLine("DLL not found: " + e.Message);
}</pre></div>
<p>如果你不确定 DLL 是 32 位还是 64 位,我也可以帮你查,或者你可以发给我我来验证。需要更多帮助也可以继续问!</p>
頁: [1]
查看完整版本: .NET 查找 DLL 路径顺序的问题小结