我需要获得一些关于调用我的组件的程序集的元数据.因此,使用Assembly.GetCallingAssembly()似乎很自然.但是,我发现除了
Windows应用商店外,它无处不在.它支持的地方:
> Phone 7.0+
> .Net 1.0
> Portable Class Libraries
但是,不支持的位置直接位于Windows应用商店应用程序中.我可以创建一个可移植的类库,然后从Windows应用程序内部调用它,但我不能直接将它放在Windows应用商店应用程序/类库中.
Assembly.GetCallingAssembly没有在WinRT中公开 – 据说是因为它的语义在内联等方面是不可靠的(
source),但它也不适合Windows Store应用程序中允许的受限反射.你可以得到像Assembly.GetCurrentAssembly()这样的东西,例如:
typeof(MainPage).GetTypeInfo().Assembly
但那根本不一样.使用受限制的反射模型,也无法在.NET中获得运行时的堆栈跟踪.
至于可移植类库,我当然会说可以在可移植类库中支持Assembly.GetCurrentAssembly(),但不是在WinRT中 – 如果它不在那个平台中就有意义.但实际上,它似乎存在于包括WinRT在内的所有配置文件中,除了WinRT .NET4.5之外 – 似乎必须在某种程度上忽略这种不一致性.因此该方法存在于WinRT中(而且还没有进行重定向),但在编译时可用的元数据中不可见.
var assembly = (Assembly) typeof(Assembly).GetTypeInfo() .GetDeclaredMethod("GetCallingAssembly") .Invoke(null,new object[0]);
我认为在Windows应用商店应用中这种方法的不可见性是“我们希望这会消失”.
(这个答案只涉及“我可以”而不是“我应该”).