#c# #pinvoke #unmanaged
#c# #пинвоук #неуправляемая
Вопрос:
Я хочу связать неуправляемую библиотеку C с приложением на C #. Я использую процесс PInvoke, потому что неуправляемая C dll имеет несколько зависимостей, которые не будут компилироваться с CLR. Когда я компилирую приведенный ниже пример кода, я получаю следующие ошибки. Я нашел ссылку, по которой мне нужно добавить ссылку на dll, но MSVS сообщает мне, что не может ее добавить. Я также читал о его регистрации в regsvr32, но, похоже, это относится к библиотекам CLR, верно? Итак, мой вопрос в том, как мне устранить эту ошибку для неуправляемой библиотеки dll?
ServerTerminal.cs(62,48): error CS1031: Type expected
ServerTerminal.cs(62,48): error CS1519: Invalid token ';' in class, struct, or interface member declaration
ServerTerminal.cs(64,48): error CS1031: Type expected
ServerTerminal.cs(64,48): error CS1519: Invalid token ';' in class, struct, or interface member declaration
ServerTerminal.cs:
class ServerTerminal
{
private delegate int Callback(string text);
private Callback mInstance;
public ServerTerminal()
{
mInstance = new Callback(Handler);
SetCallback(mInstance);
}
public void Test()
{
TestCallback();
}
private int Handler(string text)
{
return 0;
}
[DllImport(@"..\lib\DDS_Service.dll", EntryPoint="SetCallback")];
private static extern void SetCallback(Callback fn);
[DllImport(@"..\lib\DDS_Service.dll", EntryPoint="TestCallback")];
private static extern void TestCallback();
}
и компонент C DLL.h:
typedef int (__stdcall * Callback)(const char* text);
Callback Handler=0;
class COM_Component : public CM_Component
{
// Contents not pasted
}
и библиотеки DLL C Component.cpp:
extern "C" __declspec(dllexport)
void __stdcall SetCallback(Callback handler)
{
Handler = handler;
}
extern "C" __declspec(dllexport)
void __stdcall TestCallback()
{
int retval = Handler("hello world");
}
COM_Component::COM_Component( void ) : CM_Component( TDstring( "COM_Component" ) )
{
// register the observer callback methods
}
// Remainder of file not pasted
Комментарии:
1. В частности, ошибка, которую я получаю, когда пытаюсь сопоставить ссылку на DLL с проектом C #: «Не удалось добавить ссылку на dll. Пожалуйста, убедитесь, что файл доступен и что он является допустимой сборкой или компонентом COM «.
2. Удалите точку с запятой после атрибута
Ответ №1:
Ваши ошибки компилятора «недопустимый токен» вызваны точкой с запятой сразу после атрибутов DllImport. Кроме того, вы указываете дословную строку @»…» с двойной обратной косой чертой в ней. Я думаю, что ваше объявление должно выглядеть так:
[DllImport(@"..libDDS_Service.dll", EntryPoint="SetCallback")]
private static extern void SetCallback(Callback fn);
Если ваша DLL является COM dll, вы можете запустить regsvr32, чтобы зарегистрировать ее и добавить ссылку на нее в свой проект. Если это так, то вам не нужно использовать P / Invoke: вы сможете ссылаться на него, как на любую другую библиотеку.
Ответ №2:
[DllImport(@"..\lib\DDS_Service.dll", EntryPoint="SetCallback")];
private static extern void SetCallback(Callback fn);
[DllImport(@"..\lib\DDS_Service.dll", EntryPoint="TestCallback")];
private static extern void TestCallback();
Удалите ;
в строках после DllImport
атрибута.