Подтвердить что ты не робот

Как добавить ссылку на неуправляемый проект на С++, называемый проектом С#?

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

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

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

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

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

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

В Visual Studio 2010:

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

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

При нажатии "Да" появляется сообщение об ошибке "Ссылка на mycppproject" не может быть добавлена. "

4b9b3361

Ответ 1

Visual Studio не поддерживает ссылки на неуправляемый проект С++ из управляемого С#, но 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 не копировать выходную сборку сборки (поскольку проект С++ не создает ее), но значения 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

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

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

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

Ответ 3

Я бы выполнил второй ответ Slaks...

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

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

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

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

Ответ 4

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

тот факт, что в вашем С# -кодексе, доступ к Cll-dll с DLLImport не означает, означает, что Visual Studio будет знать, где и где должна быть скопирована внешняя dll.

Представьте, что DLLImport - это параметр времени исполнения, путь, который вы puth там используется во время выполнения, для поиска dll, поэтому вам нужно развернуть dll С++ самостоятельно и сделать его доступным для приложения .net, обычно в том же bin.