Библиотека смешанного режима и зависимости CRT - HELP

StackOverflow https://stackoverflow.com/questions/230715

Вопрос

Хорошо, проведя массу исследований и попробовав почти каждый управляемый Redist 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>

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

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

Это было полезно?

Решение

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

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

Другие советы

Обычно я обнаружил, что прагматический комментарий наивно snafu .

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

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='Microsoft.Windows.Common-Controls' "\
    "version='6.0.0.0' "\
    "processorArchitecture='*' "\
    "publicKeyToken='6595b64144ccf1df' "\
    "language='*'\"")

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

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

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

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

Microsoft.VC90.CRT & amp; Microsoft.VC90.MFC

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top