Runtime пытается найти exe/dll вместо ссылки.winmd
У меня есть приложение, которое использует библиотеку, на которую ссылаются. Эта библиотека, в свою очередь, ссылается на библиотеку.winmd.
Глядя на IL ссылочной библиотеки, я вижу эту ссылку:
.assembly extern windowsruntime FlurryWin8SDK
{
.ver 0:9:0:0
}
Однако во время выполнения я получаю исключение:
{"Could not load file or assembly 'FlurryWin8SDK' or one of its dependencies. The system cannot find the file specified.":"FlurryWin8SDK"}
Кроме того, с помощью Procmon я вижу, что есть попытки поиска FlurryWin8SDK.exe и FlurryWin8SDK.dll, но не для файла с расширением.winmd.
Кроме того, это вывод из журнала просмотра Fusion:
BEGIN : Framework bind.
END : The provided identity format is not recognized. (Exception from HRESULT: 0x80132003)
BEGIN : Windows Runtime Type bind.
END : The provided identity format is not recognized. (Exception from HRESULT: 0x80132003)
BEGIN : Immersive bind.
END : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
Что может быть причиной такого странного поведения?
2 ответа
Это не странное поведение. WinRT жестко остановил DLL Hell, такую проблему, которую пользователь магазина не сможет устранить. Очень жестким требованием является то, что все зависимости включены в пакет приложения. И Windows будет искать в этом пакете только DLL.
Это делает использование файла.winmd чуть менее полезным. Вы бы рассматривали его только в большом продукте, который построен из множества отдельных решений, которые упакованы отдельно.
Управляемые типы WinRT могут иногда иметь код, встроенный в файл winmd. Однако если сборка.net содержит какие-либо открытые типы, не являющиеся типами WinRT, они будут находиться в сборке.Net с расширением.Dll. Возможно, ваш компонент содержит код в DLL, а также файл winmd.