Ошибка pinvoke из-за того, что библиотеки DLL зависят от других SXS-DLL.

Коротко о проблеме: как вызвать функцию из 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++?


person user1034081    schedule 07.11.2011    source источник
comment
Точные сведения см. в журнале событий приложений Windows.   -  person Hans Passant    schedule 07.11.2011
comment
Спасибо за ваш комментарий, к сожалению, я не смог найти там никаких новых подробностей. Он просто показывает ту же ошибку, пытаюсь ли я загрузить несуществующую DLL или ту DLL, которая имеет зависимости от MSVCR90.DLL. Ошибка говорит о том, что в позиции, в которой я пытаюсь вызвать функцию из DLL, произошло исключение DllNotFoundException.   -  person user1034081    schedule 07.11.2011
comment
Я не могу видеть это отсюда. Обратите внимание на номер версии. Разверните эту DLL.   -  person Hans Passant    schedule 07.11.2011
comment
В моем сообщении была опечатка (MSVCR80 вместо MSVCR90) - извините за это. Точная версия должна быть в порядке. Необходимая версия развертывается и загружается, когда я использую библиотеку из неуправляемого C++. Так что, я думаю, библиотека и ее зависимости развернуты правильно. Должно ли это делать и для C#? Или есть что-то особенное, что следует учитывать в отличие от неуправляемого C++?   -  person user1034081    schedule 07.11.2011
comment
Вам нужно включить необходимый манифест msvcrt в манифест вашего приложения или использовать API контекста активации, чтобы получить необходимый манифест при вызове LoadLibrary.   -  person David Heffernan    schedule 07.11.2011
comment
Используя С++, DLL работает нормально, я ищу решение для С#, используя pinvoke.   -  person user1034081    schedule 07.11.2011
comment
Информация здесь может помочь вам Порядок поиска в библиотеке динамических ссылок   -  person user957902    schedule 09.11.2011


Ответы (1)


На случай, если кто-то ищет эту проблему: конечно, Дэвид Хеффернан решил проблему, зависимость должна быть добавлена ​​в манифест приложения, то есть в файл app.manifest, создайте его как новый манифест в вашем проекте, если такого файла нет. , пока что.

Достаточно следующей записи:

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>

Эта запись идет непосредственно к сборке корневого узла в файле XML.

Благодаря Дэвиду Хеффернану, забудьте о моем последнем комментарии, это было решением моего вопроса.

person user1034081    schedule 01.02.2012