运行时尝试查找exe / dll而不是.winmd引用

时间:2013-08-02 16:16:14

标签: c# windows-8 windows-runtime clr 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 logviewer的输出:

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 个答案:

答案 0 :(得分:2)

这不是奇怪的行为。 WinRT给DLL Hell带来了一个难以停止的问题,这是你不能指望商店用户进行故障排除的问题。一个非常困难的要求是应用程序包中包含所有依赖项。 Windows只会在DLL的包中查找。

这使得使用.winmd文件略微有用。您只能在一个大型产品中考虑它,这个产品是由许多单独解决方案构建的。

答案 1 :(得分:2)

托管WinRT类型有时可以在winmd文件中嵌入代码。但是,如果.net程序集包含任何非WinRT类型的公共类型,它们将位于具有.Dll扩展名的.Net程序集中。您的组件可能包含DLL中的代码以及winmd文件。