Доступ к методу из DLL из программы на C # - PullRequest
6 голосов
/ 18 июня 2011

У меня есть программа на C, и я создал файл DLL.Я использую Windows Vista и Visual C ++.

Теперь мне нужно получить доступ к методу из этой DLL, из метода Main () кода C #.Каковы шаги для этого?

До сих пор я добавил файл DLL в качестве справки, после чего я должен делать?

Это только пример:

int main1( void ) {
  prinf("Hello World");
}

Обратите внимание, что этот класс также делает нас из других функций .lib, но я смог успешно создать из него DLL.(Я не знаю, относится ли это к делу)

Теперь мне нужно получить доступ к этому методу из моего C # Main ();

[STAThread]
static void Main()
{
  // I need to call that main1() method here

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());
}

Ответы [ 3 ]

6 голосов
/ 18 июня 2011

См. с использованием класса, определенного в c ++ dll в коде c # , который имеет отличный принятый ответ. И, как писал Ганс Пассант в комментариях, вы не можете добавить собственную DLL в качестве ссылки на проект C #.

Когда я ссылаюсь на одну из моих собственных встроенных библиотек DLL, я обычно либо добавляю зависимость между проектом C # и проектом, который генерирует встроенную библиотеку DLL, либо я добавляю библиотеку DLL в виде файла связанного содержимого в проект C #, например, :

  1. Щелкните правой кнопкой мыши проект и выберите «Добавить»> «Существующий элемент».
  2. Найдите и выберите нужную DLL, но пока не нажимайте Добавить .
  3. Нажмите на крошечную стрелку справа от кнопки Добавить и выберите Добавить как ссылку .
  4. Выберите библиотеку DLL, которая теперь появляется в вашем проекте C #, и перейдите к ее свойствам.
  5. Убедитесь, что у вас Действие построения установлено Содержимое .

Это позволит скопировать 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");
    }
}

Вы должны прочитать Учебное пособие по платформе , в котором приведены все подробности.

0 голосов
/ 18 июня 2011

Вам нужно прочитать о P / Invoke aka pinvoke aka "Платформа Invoke":

http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

0 голосов
/ 18 июня 2011

Вы ищете Платформа Invoke и атрибут [DllImport].

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