Сбой pinvoke из-за того, что библиотеки DLL зависят от других библиотек SXS - PullRequest
3 голосов
/ 07 ноября 2011

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

Я пытался использовать Dependency Walker (зависит), но до сих пор не смог найти нужную версию библиотеки.

В комплект поставки входит также манифест с библиотекой, содержащей следующую запись:

В манифест включено следующее утверждение:

<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
    processorArchi    tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

Запрошенная версия существует на моем компьютере, яиспользуя VS 2010, который поставляет более новые версии этой библиотеки, но это не должно быть проблемой, я думаю.

Я обнаружил множество потоков, обсуждающих подобные проблемы.Я знаю, у меня есть проблема с зависимостями, но я нигде не мог найти решение.Я знаю мою отсутствующую зависимость, у меня есть манифест, но должен ли он это делать и для C #?Не только для неуправляемого C ++?

1 Ответ

2 голосов
/ 01 февраля 2012

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

Следующая запись достаточна:

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

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

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

...