#c# #.net #pinvoke #dll #sxs
#c# #.net #pinvoke #dll #sxs
Вопрос:
Короче говоря, проблема: как вызвать функцию из DLL A.dll использование p / invoke при A.dll зависит от другой SXS-lib (в моем случае MSVCR90.DLL )?
Я хотел бы вызвать функцию в DLL, используя pinvoke. сам pinvoke отлично работает для других библиотек. Вызов функции в DLL из неуправляемого C тоже работает нормально.
Проблема в том, что в DLL есть ссылка на MSVCR90.DLL которые находятся в некоторых папках SXS.
Используя LoadLibrary в C , библиотеку можно использовать, как упоминалось. Используя C #, я не знаю, как загрузить библиотеку. Я всегда получаю сообщение об ошибке, которое MSVCR90.DLL отсутствовал на компьютере.
Вот как выглядит загрузка библиотеки:
[DllImport("C:\work\dllhell\sample\sample.dll",
EntryPoint = "sample", CallingConvention = CallingConvention.Cdecl)]
public static extern int sample();
При вызове функции sample
я получаю только следующую ошибку: HRESULT: 0x8007007E, в которой говорится, что библиотека не была бы найдена. На самом деле, библиотека существует в различных версиях в каталогах SXS.
Я пытался использовать средство обхода зависимостей (depends), но оно также пока не смогло найти нужную версию библиотеки.
К библиотеке также прилагается манифест, содержащий следующую запись:
В манифест включен следующий оператор:
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
processorArchi tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
Запрошенная версия существует на моем компьютере, я использую VS 2010, который поставляет более новые версии этой библиотеки, но, я думаю, это не должно быть проблемой.
Я нашел много потоков, обсуждающих похожие проблемы. Я знаю, у меня проблема с зависимостью, но я нигде не мог найти решение. Я знаю свою отсутствующую зависимость, у меня есть манифест, но должно ли это делать и для C #? Не только для неуправляемого C ?
Комментарии:
1. Точные сведения см. в журнале событий приложения Windows.
2. Спасибо за ваш комментарий, к сожалению, я не смог найти там никаких новых подробностей. Он просто показывает ту же ошибку, пытаюсь ли я загрузить несуществующую DLL или ту DLL, которая зависит от MSVCR90.DLL. Ошибка говорит о том, что произошло исключение DllNotFoundException в позиции, в которой я пытаюсь вызвать функцию из DLL.
3. Я не вижу этого отсюда. Обратите внимание на номер версии. Разверните эту DLL.
4. В моей публикации была опечатка (MSVCR80 вместо MSVCR90) — извините за это. Точная версия должна быть в порядке. Необходимая версия развернута и загружается, когда я использую библиотеку из неуправляемого C . Я думаю, что библиотека и ее зависимости развернуты должным образом. Должно ли это сделать и для C #? Или есть что-то особенное, что следует учитывать в отличие от неуправляемого C ?
5. Вам необходимо включить необходимый msvcrt manfest в манифест вашего приложения или использовать activation context API, чтобы получить необходимый манифест при вызове LoadLibrary.
Ответ №1:
На случай, если кто-нибудь ищет эту проблему: конечно, Дэвид Хеффернан решил проблему, зависимость должна быть добавлена в манифест приложения, то есть в файл app.manifest, создайте его как новый манифест в вашем проекте, если такого файла еще нет.
Достаточно следующей записи:
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
Эта запись переходит непосредственно к сборке корневого узла в файле XML.
Благодаря Дэвиду Хеффернану, забудьте о моем последнем комментарии, это было решением моего вопроса.