Я создал C ++ dll, который я хотел бы вызвать из кода C #. Я могу вызвать одну функцию, но другая выдает исключение, когда код C # пытается загрузить DLL.
Заголовок выглядит так:
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Это создает dll с немного запутанной таблицей экспорта (что означает foo = foo в поле имени?):
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
Мои объявления P / Invoke выглядят так:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
Вызов Install возвращается без исключения, но когда я вызываю PPPConnect, я получаю MissingMethodException - «Не удается найти точку входа« PPPConnect »в PInvoke DLL« PPPManager.dll »."
Я попытался удалить директивы extern и declspec из объявления функции Install, чтобы PPPConnect была единственной экспортируемой функцией, и это по-прежнему не позволяет мне вызывать PPPConnect.
Я также пытался выполнить DllImport по порядковому номеру; это дает тот же результат, что и вызов по имени - программа Install возвращает, но PPPConnect выдает исключение «Не удается найти точку входа« # 2 »...».
Журнал взаимодействия дает:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
Это далеко за пределами моей компетенции, поэтому любые предложения или мысли приветствуются.
Спасибо,
Пол
редактирование:
Оказывается, этот код работает; проблема была с последним dll, не распространяемым на устройство. D'ой!