См. с использованием класса, определенного в c ++ dll в коде c # , который имеет отличный принятый ответ. И, как писал Ганс Пассант в комментариях, вы не можете добавить собственную DLL в качестве ссылки на проект C #.
Когда я ссылаюсь на одну из моих собственных встроенных библиотек DLL, я обычно либо добавляю зависимость между проектом C # и проектом, который генерирует встроенную библиотеку DLL, либо я добавляю библиотеку DLL в виде файла связанного содержимого в проект C #, например, :
- Щелкните правой кнопкой мыши проект и выберите «Добавить»> «Существующий элемент».
- Найдите и выберите нужную DLL, но пока не нажимайте Добавить .
- Нажмите на крошечную стрелку справа от кнопки Добавить и выберите Добавить как ссылку .
- Выберите библиотеку DLL, которая теперь появляется в вашем проекте C #, и перейдите к ее свойствам.
- Убедитесь, что у вас Действие построения установлено Содержимое .
Это позволит скопировать DLL в папку bin\Debug
проекта C # и убедиться, что, если вы однажды решите создать проект установки, вы можете легко ссылаться на все файлы содержимого и включать их в пакет установщика Microsoft.
Теперь, чтобы увидеть функции, написанные в вашей родной DLL, вы должны позаботиться об их экспорте (см. Экспорт функций C для использования в исполняемых файлах языка C или C ++ и Экспорт из DLL с помощью __declspec (dllexport) ). Таким образом, вам нужно добавить блок extern "C"
вокруг объявления вашей функции (я предполагаю, что вы написали свой код в исходном файле .cpp , и это означает, что компилятор выдаст mangled имена функций, если вы не объявляете их extern "C"
):
extern "C"
{
__declspec (dllexport) void __cdecl Foo(const char* arg1);
}
...
void Foo(const char* arg1)
{
printf ("Hello %s !", arg1);
}
Декорация __declspec (dllexport)
означает, что компилятор / компоновщик должен будет сделать функцию видимой снаружи DLL. И __cdecl
определяет, как параметры будут переданы в функцию (стандартный способ «C» для этого).
В вашем коде на C # вам придется ссылаться на экспортированные методы вашей DLL:
class Program
{
[DllImport("mydll.dll")]
internal static extern void Foo(string arg1);
static void Main()
{
Program.Foo ("Pierre");
}
}
Вы должны прочитать Учебное пособие по платформе , в котором приведены все подробности.