15

我在 VB、VS2012 中设置了一个 PCL,并将其设置为 Profile 78(WinRT、WinPhone8、.NET 4.5)。我没有GetExecutingAssembly可用的Assembly。据此,应该可供 PCL 使用。唯一可用的方法是Assembly.Load().

有人我应该怎么做吗?例如,这是真的吗,我的环境是否搞砸了,是否有其他访问GetExecutingAssembly方式Imports System.Reflection?还有其他想法吗?

4

2 回答 2

29

一般来说,您应该使用类似的东西typeof(MyType).GetTypeInfo().Assembly而不是Assembly.GetExecutingAssembly(). GetExecutingAssembly 基本上必须检查调用堆栈以找出调用它的方法,然后查找相应的程序集。如果方法曾经跨程序集边界内联,这可能会中断,这就是为什么 GetExecutingAssembly 方法不在 Profile 78(以及用于 Windows Store 应用程序的 .NET)使用的“新”反射表面区域中的原因。

于 2013-11-07T19:42:39.407 回答
2

在 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 
}

这种方法只会在沙盒程序集环境中为您提供可访问的程序集。但它为您提供了如何访问您不应该访问的“东西”的起点。

于 2016-08-28T17:54:37.147 回答