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