如何在Visual Studio的C#项目中设置托管与非托管DLL路径
保持DLL在
lib\x64目录的解决方案 1. 修改项目引用配置,避免托管DLL被自动复制到根目录
不要通过VS的“浏览”功能添加引用,直接编辑项目的.csproj文件,添加以下配置指定托管DLL的路径并禁止自动复制:
<ItemGroup> <Reference Include="Emgu.CV"> <HintPath>lib\x64\Emgucv.dll</HintPath> <Private>False</Private> <!-- 阻止VS自动将DLL复制到输出目录根 --> </Reference> </ItemGroup>
保存后重新加载项目,托管DLL会保持在lib\x64目录,不会被移到项目根。
2. 处理非托管DLL的加载问题
<probing>配置仅对托管程序集生效,非托管DLL的加载遵循Windows系统的DLL搜索规则,有两种可行方式:
方式一:将非托管DLL复制到输出目录的对应结构
把cvextern.dll添加到项目中(右键项目→添加→现有项,选择lib\x64下的文件),然后在文件属性里设置:
- 复制到输出目录:如果较新则复制
- 生成操作:内容
也可以直接在.csproj里添加配置:
<ItemGroup> <Content Include="lib\x64\cvextern.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </Content> </ItemGroup>
编译后输出目录会保留lib\x64结构,程序能正确找到非托管DLL。
方式二:启动时动态添加非托管DLL搜索路径
如果不想复制DLL到输出目录,可在程序启动时调用Windows API添加搜索路径:
using System; using System.IO; using System.Runtime.InteropServices; class Program { [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetDllDirectory(string lpPathName); static void Main() { // 拼接项目根目录下的lib\x64路径 string dllSearchPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "lib", "x64"); SetDllDirectory(dllSearchPath); // 后续正常使用Emgu.CV的代码 // ... } }
此方法会让系统优先在指定路径查找非托管DLL,无需复制文件。
3. 修正托管程序集的探测配置
你之前用的<probing>配置无效,是因为它的路径是相对于输出目录而非项目根目录。如果你的输出目录是bin\x64\Debug,那privatePath="lib/x64"会让程序去bin\x64\Debug\lib\x64查找托管DLL,确保输出目录存在该结构后,配置才会生效。
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

