我在VB,VS2012中设置了PCL并将其设置为Profile 78(WinRT,WinPhone8,.NET 4.5)。我GetExecutingAssembly
上没有Assembly
。根据{{3}},它应该可供PCL使用。唯一可用的方法是Assembly.Load()
。
有人应该怎么做?例如。这是真的吗,我的环境搞砸了,除了GetExecutingAssembly
之外还有其他方式可以访问Imports System.Reflection
吗?还有其他想法吗?
答案 0 :(得分:29)
通常,您应该使用typeof(MyType).GetTypeInfo().Assembly
而不是Assembly.GetExecutingAssembly()
之类的内容。 GetExecutingAssembly必须基本检查调用堆栈以找出调用它的方法,然后查找相应的程序集。如果跨越程序集边界内联方法,这可能会中断,这就是为什么GetExecutingAssembly方法不在Profile 78(以及.NET for Windows Store应用程序)使用的“新”反射表面区域中。
答案 1 :(得分:2)
分离在PLC中确实深入且非常细致。
至关重要的是要理解 Portable Class Library / PLC 作为平台配置文件并不存在。在编译PLC项目时,正在运行的应用程序不会产生与编译器相同的限制。
这是突破障碍的一种方法:
using System;
...
try {
var getExecutingAssembly = typeof(Assembly).GetRuntimeMethods()
.Where(m => m.Name.Equals("GetExecutingAssembly"))
.FirstOrDefault();
var assemblies = getExecutingAssembly.Invoke(null, null);
} catch(Exception exc){
... try something else
} finally{
... time for some alternative
}
此方法只会让您获得沙盒装配环境中的可访问程序集。但它为您提供了如何访问"东西的起点。你不应该这样做。