如何添加对C#项目调用的非托管C++项目的引用?

Waf*_*fle 36 c# c++ unmanaged visual-studio

一种解决方案(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项目的引用,但是我收到一条警告消息'项目的Target Framework版本"mycppproject"高于当前项目Target Framework版本.您是否要将此引用添加到项目中?(是/否/取消).

单击"是"将生成错误消息"无法添加对mycppproject的引用".

SLa*_*aks 36

您无法添加对非托管DLL的引用.

相反,您应该创建一个后期构建任务来复制该文件.

或者,你可以添加一个链接到非托管DLL如C#项目中的文件,并设置Build ActionNoneCopy to Output DirectoryCopy If Newer.

  • @Matt:从打开的对话框的下拉列表中选择"添加为链接". (10认同)
  • 如果我使用你的第二个建议,如果C++ dll重建,它会拿起新文件吗?它似乎在您将其添加为项目的链接时制作文件的副本. (3认同)
  • 我实际上更喜欢将Build Action设置为"Content".通过这种方式,依赖DLL会自动复制到安装和部署项目的输出目录,第二层应用程序(依赖于包含原始DLL依赖项的库)等等.它只是占用了更多用例. (2认同)

Not*_*sxl 18

我会跟随Slaks的第二个回答 ......

[...]您可以将非托管DLL的链接添加为C#项目中的文件,并将"构建操作"设置为"无"并将"复制到输出目录"设置为"如果更新则复制".

...然后是我的评论,以区分Debug和Release版本(即使有点"hackish",因为它要求你手动编辑C#项目文件)

用文本编辑器打开你的C#项目的csproj文件并搜索所有"YourNativeCppProject.dll"事件(没有".dll"子命令,所以如果你也添加了pdb文件作为链接,你会发现多次出现),并使用宏更改包含路径,例如:Include ="$(SolutionDir)$(ConfigurationName)\ YourNativeCppProject.dll

PS:如果查看属性(F4),即使切换到Release配置,VS也会显示Debug的路径,但如果编译,则会看到复制到输出的dll是发行版本*

  • 在我看来,没有什么能够编辑.csproj文件.更多要求. (4认同)

Pau*_*ner 14

Visual Studio不支持从托管C#one引用非托管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>
Run Code Online (Sandbox Code Playgroud)

执行构建时,引用将导致MSBuild首先构建引用的项目.该ReferenceOutputAssembly值告诉MSBuild不要复制构建的输出程序集(因为C++项目不生成一个),但是OutputItemTypeCopyToOutputDirectory值指示它将输出内容复制到引用项目的输出文件夹.

您将能够在Visual Studio中看到该引用,但是您无法在那里做很多事情.

这个答案是基于Kirill Osenkov在他的MSDN博客上解决的类似问题:https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without -referencing最实际二进制/

  • 但不幸的是,这种方法似乎在传递依赖的情况下使 VS 感到困惑(托管 A 依赖托管 B 依赖本机 C)——当您执行干净构建时,它会将本机 dll 复制到最终输出目录,但在后续构建中,它会主动从那里“删除”它。:( (2认同)
  • 这对我不起作用。该引用确实显示在 Visual Studio 中,但没有复制任何程序集/文件。 (2认同)