Как добавить ссылку на неуправляемый проект C ++, вызываемый проектом C #? - PullRequest
35 голосов
/ 24 февраля 2011

Одно решение (the.sln)

Один проект C ++ (mycppproject.vcxproj в 2010 или mycppproject.vcproj в 2008), который компилирует собственную DLL, экспортирующую некоторые функции.При отладке это создает c: \ output \ Debug \ mycppproject_d.dll, а в выпуске - c: \ output \ Release \ mycppproject.dll.

Одно консольное приложение C # (mycsharpconsole.csproj), содержащее вызовы PInvoke, вDLL.

Все компилируется нормально.

Когда я собираюсь, я хотел бы иметь возможность добавить ссылку из проекта csharp в проект cpp DLL, чтобы он мог скопировать соответствующий файл изсоответствующий каталог в каталог \ bin \ Debug, в который встроен проект csharp.

Это должно быть возможно, поскольку среда IDE знает все, что нужно знать о том, где создается библиотека DLL и где находится приложение C #build.

В Visual Studio 2010:

Я пробовал «Зависимости ...» в проекте csharp и добавлял зависимость от mycppproject, но это не имеет никакого эффекта.

Я пробовал «Добавить ссылку ...» в проекте csharp и добавлял ссылку на проект cpp, но я получаю предупреждение «Версия Target Framework для project "mycppproject" выше текущей версии Target Framework проекта.Вы все равно хотите добавить эту ссылку в свой проект?(Да / Нет / Отмена).

При нажатии кнопки «Да» появляется сообщение об ошибке «Невозможно добавить ссылку на mycppproject». *

Ответы [ 4 ]

36 голосов
/ 24 февраля 2011

Вы не можете добавить ссылку на неуправляемую DLL.

Вместо этого вы должны выполнить задачу пост-сборки для копирования файла.

В качестве альтернативы, вы можете добавить ссылку на неуправляемую библиотеку.DLL в качестве файла в проекте C # и установите Build Action в None и Copy to Output Directory в Copy If Newer.

18 голосов
/ 25 сентября 2012

Я бы следовал за вторым ответом Слакса ...

[...] вы можете добавить ссылку на неуправляемую DLL в виде файла в проекте C #,и установите для параметра «Действие сборки» значение «Нет», а для параметра «Копировать в выходной каталог» - «Копировать, если новее».

..., а затем мой комментарий , чтобы различать сборки отладки и выпуска (даже еслинемного "хакерский", поскольку он требует, чтобы вы вручную отредактировали файл проекта C #)

откройте файл csproj вашего проекта C # с помощью текстового редактора и найдите все вхождения "YourNativeCppProject.dll" (безподфикс «.dll», поэтому, если вы добавили файлы pdb в качестве ссылки, вы найдете более одного вхождения) и измените путь «Включить» с помощью макросов, например: Include = "$ (SolutionDir) $ (ConfigurationName)\ YourNativeCppProject.dll

PS: если вы посмотрите на свойства (F4), VS покажет вам путь отладки, даже если вы переключитесь на конфигурацию выпуска, но если вы скомпилируете, вы увидите, чтоDLL, скопированная на выход, являетсяоблегченная версия *

13 голосов
/ 28 февраля 2017

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, но там с ней мало что можете сделать.

Этот ответ основан на аналогичной проблеме, решенной Кириллом Озенковым на егоБлог MSDN: https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without-referencing-the-actual-binary/

2 голосов
/ 24 февраля 2011

Добавление ссылок работает только для сборок .NET, проектов .net в том же решении или для компонентов COM (для которых в любом случае будет создана оболочка менеджера ...).

тот факт, что в вашем C #код, к которому вы обращаетесь к dll C ++ с помощью DLLImport , не означает, что Visual Studio будет знать, откуда и куда должна быть скопирована внешняя dll.puth in используется во время выполнения для поиска dll, поэтому вам нужно развернуть dll c ++ и сделать его доступным для приложения .net, обычно в той же папке bin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...