Как я могу добавить ссылку на C-DLL в моем приложении C #? - PullRequest
1 голос
/ 24 декабря 2011

Я использовал Microsoft Visual Studio 2008 для создания приложения на C #, и теперь я хочу использовать DLL на основе C.

Как добавить ссылку на эту C-DLL в мое приложение C # в Visual Studio 2008?

1 Ответ

4 голосов
/ 24 декабря 2011

Нельзя добавить ссылку на собственную (неуправляемую) DLL в проекте C # или VB.NET. Это просто не поддерживается. Ссылки работают только для других управляемых библиотек DLL (т. Е. Тех, которые вы можете написать в C # или VB.NET или даже C ++ / CLI).

Однако, вы можете по-прежнему использовать код в этой DLL. Хитрость заключается в том, чтобы вызывать функции, которые он предоставляет динамически во время выполнения, с использованием того же синтаксиса P / Invoke, который используется для вызова функций из Win32 API.

Например, предположим, что у вас есть следующий код, скомпилированный в DLL с использованием C ++:

extern "C" {
__declspec(dllexport) void AddNumbers(int a, int b, int* result)
{
    *result = (a + b);
}
}

Теперь, предположив, что вы скомпилировали эту DLL в файл с именем test.dll, вы можете вызвать эту функцию, добавив следующий код в ваше приложение C #:

[DllImport("test.dll"), CallingConvention=CallingConvention.Cdecl)]
private static extern void AddNumbers(int a, int b, out int result);

public int AddNumbers_Wrapper(int a, int b)
{
    int result;
    AddNumbers(a, b, out result);
    return result;
}

Или в VB.NET, поскольку вы, очевидно, используете это (несмотря на все указания в вопросе):

<DllImport("test.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function AddNumbers(ByVal a As Integer, ByVal b As Integer, _
                                  ByRef result As Integer)
End Function

Public Function AddNumbers_Wrapper(ByVal a As Integer, _
                                   ByVal b As Integer) As Integer
    Dim result As Integer
    AddNumbers(a, b, result)
    Return result
End Function

Убедитесь, что вы правильно установили поле CallingConvention атрибута DllImport, в зависимости от соглашения о вызовах вашего неуправляемого метода.

Вот более подробное руководство о том, как начать работу с P / Invoke на сайте Microsoft.

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