Библиотека смешанного режима и зависимости CRT - HELP
-
04-07-2019 - |
Вопрос
Хорошо, проведя массу исследований и попробовав почти каждый управляемый 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.
Другие советы
Обычно я обнаружил, что прагматический комментарий Декларация манифеста стиля должна быть намного более безошибочной, с точки зрения разработчика и с точки зрения всего действия сборки. XML-манифест является наивно 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 указала имя файла в брошенном исключении, все было бы проще.