You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:27:29