.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的标准方式:
- 匹配架构:确保C++项目的编译架构(x64)和C#项目的目标平台一致。在C#项目属性的「生成」选项中,将「平台目标」设置为
x64(不要使用Any CPU)。 - 声明函数:在C#代码中通过
DllImport特性声明非托管函数:using System.Runtime.InteropServices; namespace YourCSharpProject { public static class NativeMethods { // 替换为你的DLL文件名 [DllImport("YourCppDll.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int Function(); } } - 复制DLL到输出目录:
- 方法一:在C++项目的属性中,进入「生成事件」->「后期生成事件命令行」,添加命令将DLL复制到C#项目的输出目录,例如:
copy "$(TargetDir)$(TargetFileName)" "$(SolutionDir)YourCSharpProject\bin\$(Configuration)\net6.0\" - 方法二:将C++生成的DLL添加到C#项目中,在文件属性里设置「复制到输出目录」为「如果较新则复制」。
- 方法一:在C++项目的属性中,进入「生成事件」->「后期生成事件命令行」,添加命令将DLL复制到C#项目的输出目录,例如:
- 调用函数:在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项目作为桥接层:
- 创建C++/CLI类库项目,引用你的非托管C++项目。
- 编写包装类暴露非托管函数:
#include "YourCppHeader.h" namespace CppCliWrapper { public ref class FunctionWrapper { public: static int CallNativeFunction() { return Function(); // 调用非托管的Function函数 } }; } - 在C#项目中直接添加对C++/CLI项目的引用,然后调用
FunctionWrapper.CallNativeFunction()即可。
注意事项
- 必须保证C++ DLL和C#项目的编译模式(Debug/Release)一致,否则可能出现运行时错误。
- 若调用函数涉及复杂参数(如字符串、结构体),需注意托管与非托管类型的转换规则。
内容的提问来源于stack exchange,提问作者Iman Abdollahzadeh
相关产品推荐
相关产品推荐

