[英]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 Directory
為Copy 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 ++項目不會生成該生成的程序集),但是OutputItemType
和CopyToOutputDirectory
值指示它將輸出內容復制到引用項目的輸出文件夾中。
您將能夠在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.