我在 VB、VS2012 中设置了一个 PCL,并将其设置为 Profile 78(WinRT、WinPhone8、.NET 4.5)。我没有GetExecutingAssembly
可用的Assembly
。据此,它应该可供 PCL 使用。唯一可用的方法是Assembly.Load()
.
有人我应该怎么做吗?例如,这是真的吗,我的环境是否搞砸了,是否有其他访问GetExecutingAssembly
方式Imports System.Reflection
?还有其他想法吗?
我在 VB、VS2012 中设置了一个 PCL,并将其设置为 Profile 78(WinRT、WinPhone8、.NET 4.5)。我没有GetExecutingAssembly
可用的Assembly
。据此,它应该可供 PCL 使用。唯一可用的方法是Assembly.Load()
.
有人我应该怎么做吗?例如,这是真的吗,我的环境是否搞砸了,是否有其他访问GetExecutingAssembly
方式Imports System.Reflection
?还有其他想法吗?
一般来说,您应该使用类似的东西typeof(MyType).GetTypeInfo().Assembly
而不是Assembly.GetExecutingAssembly()
. GetExecutingAssembly 基本上必须检查调用堆栈以找出调用它的方法,然后查找相应的程序集。如果方法曾经跨程序集边界内联,这可能会中断,这就是为什么 GetExecutingAssembly 方法不在 Profile 78(以及用于 Windows Store 应用程序的 .NET)使用的“新”反射表面区域中的原因。
在 PCL 中,这种分离确实很深而且相当细致。
在此了解作为平台配置文件的可移植类库不存在是至关重要的。在编译您的 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
}
这种方法只会在沙盒程序集环境中为您提供可访问的程序集。但它为您提供了如何访问您不应该访问的“东西”的起点。