Процедура, импортированная {dll}, не может быть загружена

У меня есть несколько написанных на неуправляемом C++ файлов lib, которые мне нужно связать с dll управляемого C++.
Затем мне нужно вызвать функции этого управляемого C++ из приложения C#.

Первый шаг в порядке - создается управляемая C++ dll, я вижу с помощью ildasm, что она экспортирует нужные мне функции. Однако, когда я пытаюсь вызвать эту функцию из моего тестового приложения, написанного на С#, он говорит:

Произошло необработанное исключение типа «System.IO.FileLoadException» в неизвестном модуле.
Не удалось загрузить процедуру, импортированную с помощью {MyManagedCPP.dll}.

Это сообщение исходит из VS2010.
Я провел простой эксперимент - удалил зависимости из всех файлов lib в Managed C++ dll и пересобрал его.
С этим изменением все в порядке - приложение запускается, я могу вызывать функции Managed C++ dll из Тестовое приложение С#.

Разве нельзя по дизайну вызывать управляемые функции С++, когда dll имеет статическую связь с файлами lib? Техническое ограничение? Или есть обходной путь?

Спасибо


person IgorStack    schedule 23.05.2013    source источник
comment
Взгляните на System.Runtime.InteropServices. В частности DllImport["my.dll']. Будьте осторожны с тем, куда вы помещаете свои DLL (они должны находиться в рабочем каталоге, определенном вашим проектом, не обязательно рядом с exe.   -  person axon    schedule 23.05.2013
comment
Нет, я не думаю, что мне нужен здесь DLLImport. В конце концов я управлял dll и управлял exe. Но [DLLImport] указывает, что метод с атрибутами предоставляется неуправляемой библиотекой динамической компоновки (DLL) в качестве статической точки входа. что это не мой случай.   -  person IgorStack    schedule 23.05.2013


Ответы (1)


У вас, несомненно, есть неявная зависимость от родной DLL. Из вопроса не ясно, что это может быть за DLL. Например, это может быть msvcrxx.dll, библиотека поддержки среды выполнения для собственного кода C++. Что было бы довольно плохо, вы не хотите смешивать версии CRT. В противном случае такая отсутствующая библиотека DLL препятствует загрузке сборки C++/CLI, вызывая исключение FileLoadException.

Если вы понятия не имеете, что это за DLL, вы можете использовать утилиту SysInternals ProcMon. Трассировка покажет вам, что программа ищет DLL и не находит ее. Если это msvcrxx.dll, обязательно пересоберите файлы .lib, используя ту же версию компилятора, которая использовалась для сборки сборки C++/CLI. Если это что-то другое, убедитесь, что вы скопировали эту DLL в каталог сборки.

person Hans Passant    schedule 23.05.2013
comment
К сожалению, я не могу восстановить файлы lib - у меня нет исходников. И я также знаю, что они построены с использованием VS2008, а я использую VS2010. Когда я получаю сообщение об ошибке, я вижу в проводнике процессов, что загружается управляемая dll и неуправляемая dll (от которой зависит управляемая). Очень похоже, что это проблема с разными версиями используемых компиляторов. - person IgorStack; 23.05.2013
comment
Что ж, технически можно пережить несоответствие, если DLL была спроектирована правильно. Однако вам потребуется правильная версия msvcr90.dll на вашем компьютере, чтобы устранить FileLoadException. - person Hans Passant; 23.05.2013