Assembly.GetCallingAssembly
没有在 WinRT 中公开 - 据说是因为它的语义在面对内联等(来源)时不可靠,但它也不太适合 Windows 应用商店应用程序中允许的受限反射。你可以得到类似的东西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 应用商店应用程序中的不可见性是“我们希望这会消失”。
(这个答案只涉及“我可以”而不是“我应该”)。