Добавить ссылку из приложения на C # в DLL, скомпилированную без / clr? - PullRequest
6 голосов
/ 18 января 2010

Я использую Visual Studio 2008 для создания решения с двумя проектами: консольное приложение C # и C ++ DLL. Я хочу, чтобы приложение для вызова функции из DLL с помощью P / Invoke. Поэтому я пытаюсь добавить DLL в качестве ссылки на приложение C #. Но когда я пытаюсь выполнить команду «Добавить ссылку», Visual Studio не позволит мне сделать это, пока я не установлю свойство / clr в dll (в разделе «Свойства конфигурации: Общие»). Теперь я подумал, что P / Invoke может обрабатывать простые старые win32-библиотеки. Действительно, если я создаю свою dll без / clr и просто копирую ее вручную в bin / Debug, тогда приложение работает нормально. Так почему / clr требуется добавить DLL в качестве ссылки? И если VS не позволит мне добавить его, есть ли какой-нибудь (чистый) обходной путь, чтобы мое приложение нашло dll?

Я вижу, что у кого-то здесь была похожая проблема (хотя с сторонним dll): Невозможно добавить ссылку на DLL на VS 2008 Ответ, который он получил, заключался в создании оболочки. Но в этом нет необходимости, так как приложение может нормально использовать dll; это просто шаг Добавить ссылку, который не работает. И кроме того, не будет ли в коде-обертке ссылка на dll, что вызовет ту же проблему, что и раньше? Мне бы очень хотелось получить ответ, который вообще не требует написания обертки.

Ответы [ 4 ]

7 голосов
/ 18 января 2010

Почему бы просто не добавить шаг после сборки, чтобы скопировать неуправляемую DLL в каталог проекта? Вам не нужна «ссылка», чтобы иметь возможность ссылаться на неуправляемую DLL, и, похоже, единственная проблема, с которой вы столкнулись, связана с тем, что файл не копируется автоматически в путь поиска.

6 голосов
/ 18 января 2010

При использовании PInvoke в C ++ DLL добавление ссылки не требуется. Ссылки необходимы только при вызове управляемого кода в другой DLL. Просто поместите C ++ DLL в тот же каталог и добавьте его имя в атрибут DllImport

0 голосов
/ 30 мая 2011

Решил похожую проблему, выполнив следующее:

  1. На всех машинах разработки добавил путь к рассматриваемым dll-s в переменную окружения PATH.Таким образом, все разработчики могут отлаживать все исполняемые файлы, которые имеют ссылку на сборку, с помощью неуправляемых dll-ов без необходимости написания сценария пост-сборки для каждого исполняемого файла.

  2. Для производства, ночная задача msbuild собирает все в одну папку, а неуправляемые библиотеки DLL, помеченные как «Содержимое / Всегда копировать», автоматически включаются в сборку той сборки, частью которой они являются.

0 голосов
/ 18 января 2010

Теоретически вы можете добавить C ++ - DLL в качестве связанного ресурса к вашему C # -DLL. Это заставит .NET копировать вашу C ++ - DLL, куда бы она ни копировала C # -DLL, даже в GAC. Теоретически означает, что есть некоторые недостатки:

  • Вы можете указать компилятору C # (csc.exe) с помощью параметров командной строки добавить связанный ресурс, но я так и не нашел способа сделать это с помощью файла .csproj или даже Visual Studio
  • Если C # -DLL содержит пользовательские элементы управления WinForms и вы хотите использовать его в конструкторе, он не будет работать, потому что Winforms-Designer копирует C # -DLL во временную папку, куда он загружает его, но игнорирует связанный ресурс.
  • Я не знаю, сработает ли это, если вы поместите свой C # -DLL в GAC (да, C ++ - DLL также войдет в качестве ресурса, но я не знаю, найден ли он при запуске вашего C # - DLL!)

Так что, если ничего из вышеперечисленного вам не подходит, вы можете вызвать csc.exe следующим образом:

csc.exe ... /linkresource:cpp.dll

Надеюсь, это поможет!

...