Dot-Net

PCL 中不存在 Assembly.GetExecutingAssembly

  • September 4, 2020

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

這種方法只會在沙盒程序集環境中為您提供可訪問的程序集。但它為您提供瞭如何訪問您不應該訪問的“東西”的起點。

引用自:https://stackoverflow.com/questions/19718232