Использование библиотеки c ++ в c # - PullRequest
10 голосов
/ 21 апреля 2009

Эй, ребята, я пытаюсь включить библиотеку c ++ (DLL) в мой проект c #, но каждый раз, когда я делаю это, я получаю следующее сообщение об ошибке в VS2008, любые предложения ??

РЕДАКТИРОВАТЬ: Это C ++ MFC DLL


Microsoft Visual Studio

Не удалось добавить ссылку на C: \ Users \ cholachaguddapv \ Desktop \ imaging.dll. Убедитесь, что файл доступен и является допустимым компонентом сборки или COM.

Ответы [ 5 ]

18 голосов
/ 21 апреля 2009

Если это «нормальная» DLL (не COM, не управляемая C ++), вы не можете добавить такую ​​ссылку. Вы должны добавить подписи p / invoke (определения внешних статических методов) для экспортов, которые вы хотите вызвать в вашей DLL.

[DllImport("yourdll.dll")]
public static extern int ExportToCall(int argument);

Посмотрите на атрибут DllImport в онлайн-справке.

5 голосов
/ 21 апреля 2009

Если это простая библиотека C ++, то ссылаться на нее невозможно.

У вас есть два варианта, вы можете скомпилировать библиотеку C ++ как сборку и предоставить неуправляемый код с помощью оболочки C ++ / CLI.

-или-

Вы можете использовать некоторые вызовы p / invoke, если библиотека предоставляет свои функциональные возможности через C API.

Не могли бы вы немного расширить вопрос, чтобы включить некоторые подробности о том, как вы обычно вызываете imaging.dll из c ++?

3 голосов
/ 21 апреля 2009

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

public classFoo

{

[DllImport("myunmanaged.dll", CharSet = CharSet.Ansi)]

private extern static int UnmanagedFunction(int type, int dest);

}

Если вы хотите преобразовать его в управляемый dll, посмотрите здесь: http://msdn.microsoft.com/en-us/library/aa446538.aspx

Если вы хотите узнать больше о pinvoke и dllimport, посмотрите здесь: http://msdn.microsoft.com/en-us/library/aa288468.aspx

Приветствия

2 голосов
/ 21 апреля 2009

Соглашение о вызовах и различие моделей памяти между управляемым кодом (C #) и неуправляемым кодом (WIn32 C ++) делают их несовместимыми.

Однако .NET включает технологию моста для COM-объектов, поэтому, если вы представляете DLL-файл как COM-объект, его можно заставить работать. Однако это, очевидно, не COM-объект.

1 голос
/ 21 апреля 2009

Если это чистая C ++ DLL, в которую вы экспортируете только C-совместимые функции, то вы можете использовать P / Invoke для использования этих функций. Если вы превратите эту C ++ DLL в COM DLL с библиотекой типов, использовать ее будет еще проще: вы можете импортировать библиотеку типов в оболочки .NET и .NET (называемые исполняемыми оболочками), которые создаются для вас.

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