Коротко о проблеме: как вызвать функцию из DLL A.dll с помощью p/invoke, когда A.dll зависит от другой SXS-lib (в моем случае MSVCR90.DLL)?
Я хотел бы вызвать функцию в DLL с помощью pinvoke. Сам pinvoke отлично работает для других библиотек. Вызов функции в DLL из неуправляемого C++ тоже работает нормально.
Проблема в том, что в DLL есть ссылка на MSVCR90.DLL, которая находится в некоторых папках SXS.
Используя LoadLibrary в C++, библиотеку можно использовать, как уже упоминалось. Используя С#, я не знаю, как загрузить библиотеку. Я всегда получаю сообщение об отсутствии MSVCR90.DLL на компьютере.
Вот как выглядит загрузка библиотеки:
[DllImport("C:\\work\\dllhell\\sample\\sample.dll",
EntryPoint = "sample", CallingConvention = CallingConvention.Cdecl)]
public static extern int sample();
При вызове функции sample
я получаю только следующую ошибку: HRESULT: 0x8007007E о том, что библиотека не найдена. На самом деле библиотека существует в различных версиях в каталогах SXS.
Я пытался использовать Dependency Walker (зависит), но пока не смог найти нужную версию библиотеки.
Кроме того, вместе с библиотекой поставляется манифест, содержащий следующую запись:
В манифест включен следующий оператор:
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
processorArchi tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
Запрошенная версия существует на моем компьютере, я использую VS 2010, который поставляет более новые версии этой библиотеки, но, я думаю, это не должно быть проблемой.
Нашел много тем с обсуждением подобных проблем. Я знаю, у меня проблема с зависимостью, но я нигде не мог найти решение. Я знаю свою отсутствующую зависимость, у меня есть манифест, но нужно ли это делать и для C#? Не только для неуправляемого C++?