WinRT不支持Assembly.GetCallingAssembly,但适用于可移植类库?

Ear*_*rlz 8 .net reflection portable-class-library windows-runtime windows-store-apps

我需要获得一些关于调用我的组件的程序集的元数据.因此,使用Assembly.GetCallingAssembly()似乎是一种自然的契合.但是,我发现除了Windows应用商店外,它可以在任何地方使用.它支持的地方:

但是,不支持的位置直接位于Windows应用商店应用程序中.我可以创建一个可移植的类库,然后从Windows应用程序内部调用它,但我不能直接将它放在Windows应用商店应用程序/类库中.

是否有针对此提供的解决方法或其他方式来获取由此提供的元数据类型Assembly

Nic*_*s W 7

Assembly.GetCallingAssembly在WinRT中没有暴露 - 因为它的语义在内联等()面前是不可靠的,但它也不适合Windows Store应用程序允许的受限反射.你可以得到Assembly.GetCurrentAssembly()像这样的东西:

typeof(MainPage).GetTypeInfo().Assembly
Run Code Online (Sandbox Code Playgroud)

但那根本不一样.使用受限制的反射模型,在.NET中尽可能获得堆栈跟踪也是不可能的.

至于可移植类库,我Assembly.GetCurrentAssembly()一般都说可以在可移植类库中得到支持,但是在WinRT中却没有 - 如果它根本不在那个平台上就有意义.但实际上,它似乎存在于包括WinRT在内的所有配置文件中,除了WinRT + .NET4.5之外 - 似乎必须在某种程度上忽略这种不一致性.因此,该方法目前在WinRT中(而且没有排序重定向回事),但可在编译时元数据不可见.

因此,您可以使用反射调用该方法:

var assembly = (Assembly) typeof(Assembly).GetTypeInfo()
    .GetDeclaredMethod("GetCallingAssembly")
    .Invoke(null, new object[0]);
Run Code Online (Sandbox Code Playgroud)

我认为在Windows应用商店应用中这种方法的不可见性是"我们希望这会消失".

(这个答案只涉及"我可以"而不是"我应该").