Библиотека смешанного режима и зависимости CRT - HELP - PullRequest
1 голос
/ 23 октября 2008

Хорошо, после тонны исследований и проб почти всех управляемых переадресаций CPP, которые я могу найти, а также попыток скопировать мои DLL локально в исполняемый каталог приложения, я не могу понять, какие зависимости мне не хватает для этого смешанного библиотека режимов.

В основном у меня большое приложение на C #, и я пытаюсь использовать созданную мной библиотеку смешанного режима. На компьютере разработчика он работает идеально (конечно), но разворачивается, когда библиотека должна быть загружена для использования ее исключений из-за отсутствующих зависимостей CRT (я полагаю).

Я использовал средство обхода зависимостей, чтобы проверить все библиотеки DLL, на которые есть ссылки, и убедился, что они существуют на компьютере для развертывания, и мне не повезло. Мне интересно, может быть, мне нужны какие-то зависимости, которые мне не нужны, но я не могу их зарегистрировать выясни что.

Я получаю следующее исключение, когда код пытается создать экземпляр класса из библиотеки смешанного режима.

Деталь исключения: System.IO.FileLoadException: не удалось загрузить файл или сборку 'USADSI.MAPI, Version = 1.0.3174.25238, Культура = нейтральная, PublicKeyToken = null ' или одна из его зависимостей. это приложение не запустилось потому что конфигурация приложения это неверно. Переустановка Приложение может решить эту проблему. (Исключение из HRESULT: 0x800736B1)

Я компилирую библиотеку с использованием VS2008 SP1 с указанным параметром / clr: oldSyntax.

Промежуточный манифест выглядит так:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Я могу предоставить любую дополнительную информацию по мере необходимости, к сожалению, я не очень разбираюсь в создании библиотек смешанного режима, так что это отбросило меня.

Если кто-нибудь может дать какой-либо совет, я был бы очень признателен!

Ответы [ 5 ]

4 голосов
/ 23 октября 2008

Развернули ли вы библиотеки CRT на целевом компьютере? Скорее всего: поскольку у вас есть зависимость от 32-битного кода, вы должны установить Target Platform на вкладке свойств сборки в значение x86.

РЕДАКТИРОВАТЬ: устранение неполадок при одновременном устранении проблем с помощью утилиты Sxstrace.exe , доступной в Vista.

2 голосов
/ 02 июня 2009

Как правило, я обнаружил, что декларация в стиле в прагматическом комментарии гораздо более безошибочна, с точки зрения разработчика и с точки зрения всех действий при сборке. XML-манифест: snafu .

Сходство с тем, как работает компоновщик, и обычная компиляция кода на C и тот факт, что вы просто добавляете это в один из ваших исходных файлов, заставляет все чувствовать себя немного «вместе»;

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='Microsoft.Windows.Common-Controls' "\
    "version='6.0.0.0' "\
    "processorArchitecture='*' "\
    "publicKeyToken='6595b64144ccf1df' "\
    "language='*'\"")
1 голос
/ 04 ноября 2008

Лучший способ решить эту проблему - это загрузить монитор процесса, который свободен от: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

Добавьте фильтр, чтобы наблюдать только ваш процесс, и он покажет вам весь доступ к файлам, который пытается процесс. Это покажет вам точно, какую DLL он не может найти.

Я всегда использую это, когда сталкиваюсь с одной и той же проблемой - если бы только Microsoft указала имя файла в брошенном исключении, все было бы проще.

1 голос
/ 24 октября 2008

Я нашел решение, которое, кажется, работает, хотя мне оно не очень нравится.

Мне пришлось скопировать папки:

Microsoft.VC90.CRT & Microsoft.VC90.MFC

От: Program Files \ Microsoft Visual Studio 9.0 \ VC \ redist \ x86

В каталог развернутого приложения я просто не могу понять, почему это работает, а распространяемые файлы ничего не сделали.

РЕДАКТИРОВАТЬ: Глядя на манифест, мне, вероятно, не нужно копировать каталог MFC

1 голос
/ 24 октября 2008

У меня была похожая проблема, когда я впервые развернул приложение VS 2005 на целевой машине - мне пришлось перенести библиотеку MSVCRT80. Вы говорите, что у вас уже есть библиотека времени выполнения 2008 VS?

ETA: Также тупой вопрос, но вы уверены, что у вас есть и CRT Runtime (ссылка на которую приведена выше) и .NET Runtime, с той же версией, с которой вы скомпилировали (вероятно, 3.5)? Вы, наверное, уже знаете это (особенно учитывая ваш счет), но это две разные вещи.

...