如何添加对C#项目调用的非托管C ++项目的引用?
一个解决方案(the.sln)
一个C ++项目(2010年的mycppproject.vcxproj或2008年的mycppproject.vcproj),它编译导出一些函数的本机DLL。 在调试时,这会生成c: output Debug mycppproject_d.dll,并且在发布版本中会生成c: output Release mycppproject.dll。
包含PInvoke调用的一个C#控制台应用程序(mycsharpconsole.csproj)调用到DLL中。
所有编译都很好。
当我编译时,我希望能够将csharp项目的引用添加到cpp DLL项目中,以便它可以将适当的文件从适当的目录复制到csharp项目内置的 bin Debug目录中。
这应该是可能的,因为IDE知道要知道DLL的构建位置以及C#应用程序的构建位置。
在Visual Studio 2010中:
我已经尝试了csharp项目上的“Dependencies ...”,并在mycppproject上添加了一个依赖项,但这没有任何作用。
我已经在csharp项目上尝试了“Add Reference ...”并添加了对cpp项目的引用,但是我收到一条警告消息“项目的目标框架版本”mycppproject“高于当前项目的Target Framework版本。 你想不想把这个引用添加到你的项目中?' (是/否/取消)。
单击“是”会生成错误消息“无法添加对mycppproject的引用”。“
Visual Studio不支持从托管C#引用非托管C ++项目,但MSBuild支持从任何其他项目引用任何项目。
您可以手动编辑.csproj文件,手动添加对项目的引用。 在该文件中,找到您现有的一组ProjectReference
元素(或添加一个新的ItemGroup
如果您没有的话),并添加以下参考:
<ProjectReference Include="..mycpproject.csproj">
<Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
<Name>mycppproject</Name>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<OutputItemType>Content</OutputItemType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ProjectReference>
当您执行构建时,引用将导致MSBuild首先构建引用的项目。 ReferenceOutputAssembly
值告诉MSBuild不要复制构建的输出程序集(因为C ++项目不会生成一个),但OutputItemType
和CopyToOutputDirectory
值指示它将输出内容复制到引用项目的输出文件夹。
您将能够在Visual Studio中查看参考,但您无法在此处使用它。
这个答案基于Kirill Osenkov在他的MSDN博客上解决的类似问题:https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without -referencing最实际二进制/
您不能添加对非托管DLL的引用。
相反,您应该制作后期制作任务以复制文件。
或者,您可以将链接添加到非托管DLL作为C#项目中的文件,并将“ Build Action
设置为“ None
并将“ Copy to Output Directory
为Copy If Newer
。
我会按照Slaks的第二个答案...
[...]您可以将链接添加到非托管DLL作为C#项目中的文件,并将“生成操作”设置为“无”,并将“复制到输出目录”设置为“如果更新”。
...接下来是我的评论,区分Debug和Release版本(即使它有点“黑客”,因为它需要你手动编辑C#项目文件)
使用文本编辑器打开C#项目的csproj文件并搜索所有“YourNativeCppProject.dll”事件(没有“.dll”子项,因此如果您也将pdb文件添加为链接,则会发现不止一次),并使用宏更改包含路径,例如:Include =“$(SolutionDir)$(ConfigurationName) YourNativeCppProject.dll
PS:如果你看看属性(F4),即使你切换到Release配置,VS也会显示Debug的路径,但是如果你编译了,你会看到复制到输出的dll是发布版本*
链接地址: http://www.djcxy.com/p/85429.html上一篇: How do I add a reference to an unmanaged C++ project called by a C# project?
下一篇: Open two instances of a file in single Visual Studio session