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

.NET 6中C#添加C++ DLL引用报错:引用无效或不支持

解决.NET 6中添加非托管C++ DLL项目引用报错的问题

问题原因

.NET 6(及其他.NET Core系列版本)不再支持通过「添加->项目引用...」直接引用非托管C++ DLL,而.NET Framework(如.NET 4.0)允许将其作为内容引用,这是两者的机制差异导致的报错。

解决方案

方式1:使用P/Invoke直接调用(推荐)

这是.NET Core/.NET 6+调用非托管DLL的标准方式:

  1. 匹配架构:确保C++项目的编译架构(x64)和C#项目的目标平台一致。在C#项目属性的「生成」选项中,将「平台目标」设置为x64(不要使用Any CPU)。
  2. 声明函数:在C#代码中通过DllImport特性声明非托管函数:
    using System.Runtime.InteropServices;
    
    namespace YourCSharpProject
    {
        public static class NativeMethods
        {
            // 替换为你的DLL文件名
            [DllImport("YourCppDll.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern int Function();
        }
    }
    
  3. 复制DLL到输出目录:
    • 方法一:在C++项目的属性中,进入「生成事件」->「后期生成事件命令行」,添加命令将DLL复制到C#项目的输出目录,例如:
      copy "$(TargetDir)$(TargetFileName)" "$(SolutionDir)YourCSharpProject\bin\$(Configuration)\net6.0\"
      
    • 方法二:将C++生成的DLL添加到C#项目中,在文件属性里设置「复制到输出目录」为「如果较新则复制」。
  4. 调用函数:在C#代码中直接调用NativeMethods.Function()即可。

方式2:手动配置项目引用实现自动复制

如果希望保留类似项目引用的便捷性(自动同步DLL),可以修改C#项目的.csproj文件,添加以下配置:

<ItemGroup>
  <!-- 替换为你的C++项目路径 -->
  <ProjectReference Include="..\YourCppProject\YourCppProject.vcxproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    <OutputItemType>Content</OutputItemType>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </ProjectReference>
</ItemGroup>

配置完成后,构建C#项目时会自动将C++ DLL复制到输出目录,之后仍需通过P/Invoke调用函数。

方式3:使用C++/CLI作为中间层

如果需要更复杂的类型交互(比如传递类、字符串等),可以创建C++/CLI项目作为桥接层:

  1. 创建C++/CLI类库项目,引用你的非托管C++项目。
  2. 编写包装类暴露非托管函数:
    #include "YourCppHeader.h"
    
    namespace CppCliWrapper
    {
        public ref class FunctionWrapper
        {
        public:
            static int CallNativeFunction()
            {
                return Function(); // 调用非托管的Function函数
            }
        };
    }
    
  3. 在C#项目中直接添加对C++/CLI项目的引用,然后调用FunctionWrapper.CallNativeFunction()即可。

注意事项

  • 必须保证C++ DLL和C#项目的编译模式(Debug/Release)一致,否则可能出现运行时错误。
  • 若调用函数涉及复杂参数(如字符串、结构体),需注意托管与非托管类型的转换规则。

内容的提问来源于stack exchange,提问作者Iman Abdollahzadeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:02:34