c # — LINQPad: Попытка использовать сборку, которая использует [DllImport] для доступа к C ++ dll

Я добавил MyAssembly.dll в качестве дополнительной ссылки на мой запрос, и это прекрасно работает: я могу использовать различные классы из него без проблем.

Один из методов для одного из классов в MyAssembly.dll ссылается на другую DLL (Wrapper.dll). Wrapper.dll использует [DllImport] для доступа к функциональности в C ++ dll (C.dll):

[DllImport («C.dll», CallingConvention = CallingConvention.StdCall, EntryPoint = «CPlusPlusFunction»)] внутренний статический extern UInt32 _CPlusPlusFunction ([MarshalAs (UnmanagedType.LPWStr)] строка file_path);

Хотя этот метод прекрасно работает при запуске из MyApp.exe, который ссылается на MyAssembly.dll (который ссылается на Wrapper.dll, который ссылается на C.dll), в LINQPad я не могу заставить его работать.

Если я только добавлю ссылку на MyAssembly.dll и попытаюсь запустить метод, я получу:

DllNotFoundException: невозможно загрузить DLL «C.dll»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

Если я добавлю дополнительную ссылку просто Wrapper.dll, я получу ту же ошибку.

Если я добавлю дополнительную ссылку для обоих Wrapper.dll и C.dll, я получу:

Не удалось открыть файл метаданных «C.dll» — «Была предпринята попытка загрузить программу с неверным форматом».

Если я добавлю дополнительную ссылку просто C.dll, я получаю ту же ошибку.

Любая идея о том, как я могу заставить это работать в LINQPad, как это происходит в MyApp.exe?

3

Решение

Вы делаете это точно так же, вам придется скопировать его в тот же каталог, что и EXE, чтобы Windows могла его найти. LINQPad EXE в этом случае. C: \ Program Files (x86) \ LINQPad4 по умолчанию. Или любой каталог, который находится в PATH, c: \ windows \ syswow64 — печально известный выбор. Лучше не делать этого.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]