PCL中不存在Assembly.GetExecutingAssembly

时间:2013-10-31 23:14:37

标签: .net vb.net reflection portable-class-library

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

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

2 个答案:

答案 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 
}

此方法只会让您获得沙盒装配环境中的可访问程序集。但它为您提供了如何访问"东西的起点。你不应该这样做。