繁体   English   中英

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

[英]How do I add a reference to an unmanaged C++ project called by a C# project?

一种解决方案(the.sln)

一个C ++项目(2010年为mycppproject.vcxproj或2008年为mycppproject.vcproj),该项目编译了一个本机DLL,可以导出某些函数。 在调试中,此版本生成c:\\ output \\ Debug \\ mycppproject_d.dll,在发行版中,此版本生成c:\\ output \\ Release \\ mycppproject.dll。

一个包含PInvoke调用到DLL的C#控制台应用程序(mycsharpconsole.csproj)。

所有编译都很好。

构建时,我希望能够将csharp项目中的引用添加到cpp DLL项目中,以便它可以将适当的文件从相应的目录复制到csharp项目内置的\\ bin \\ Debug目录中。

这应该是可能的,因为IDE知道所有有关DLL的生成位置以及C#应用程序的生成位置的信息。

在Visual Studio 2010中:

我已经在csharp项目上尝试了“ Dependencies ...”,并在mycppproject上添加了一个依赖项,但这没有任何效果。

我在csharp项目上尝试了“添加引用...”并添加了对cpp项目的引用,但是我收到警告消息“项目“ mycppproject”的目标框架版本高于当前项目的目标框架版本。 您是否仍要将此引用添加到您的项目中?” (是/否/取消)。

单击“是”会产生错误消息“无法添加对mycppproject的引用”。

您不能添加对非托管DLL的引用。

相反,您应该执行构建后任务来复制文件。

或者,您可以在C#项目中将到非托管DLL的链接作为文件添加,并将Build Action设置为None然后Copy to Output DirectoryCopy If Newer

我会遵循Slaks的第二个答案 ...

您可以在C#项目中以文件形式添加到非托管DLL的链接,并将“构建操作”设置为“无”,并将“复制到输出目录”设置为“如果较新则复制”。

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

使用文本编辑器打开C#项目的csproj文件,并搜索所有出现的“ YourNativeCppProject.dll”(不包含“ .dll”子修补程序,因此,如果也将pdb文件添加为链接,则会发现不止一个出现),并使用宏更改包含路径,例如:Include =“ $(SolutionDir)$(ConfigurationName)\\ YourNativeCppProject.dll

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

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 ++项目不会生成该生成的程序集),但是OutputItemTypeCopyToOutputDirectory值指示它将输出内容复制到引用项目的输出文件夹中。

您将能够在Visual Studio中看到该引用,但是在此不能做太多事情。

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

Add Rederences仅适用于.NET程序集,相同解决方案中的.net项目或COM组件(无论如何将为其创建管理器包装...)。

在您的C#代码中使用DLLImport访问C ++ dll的事实并不意味着Visual Studio会知道将外部dll从何处复制到何处。

想象一下DLLImport是一个运行时选项,您在其中放置的路径在运行时用于查找dll,因此您必须自己部署c ++ dll并使其可用于.net应用程序,通常在同一bin文件夹中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM