簡體   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