我正在使用共享 DLL。在我的 Main() 中,我向加載 DLL 的 AppDomain.CurrentDomain.AssemblyResolve 添加了一個處理程式。這適用于我的一些程式,其他程式甚至在使用 System.IO.FileNotFoundException 進入 Main() 之前崩潰(它無法找到 DLL 檔案)。
有誰知道為什么我的一些程式在進入 Main() 之前嘗試加載 DLL 而其他程式則沒有?在到達 Main() 之前,我必須更改什么以防止加載 DLL?
uj5u.com熱心網友回復:
我做了一個repro。正如所強調的,重要的是您提供一個最小的、可重現的示例。
它涉及公共列舉屬性(Address.All在您的情況下)。當我部署這個程式并洗掉共享 DLL 時,這會在不呼叫我的事件處理程式的情況下拋出:
public class Program
{
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve = AssemblyResolveHandler;
Console.WriteLine("In Main()");
_ = new Foo();
}
private static Assembly AssemblyResolveHandler(object sender, ResolveEventArgs args)
{
throw new NotImplementedException("I'm afraid I can't do that, Dave.");
}
}
public class Foo
{
public Foo()
{
Console.WriteLine("In Foo constructor");
}
public SharedClassLibrary.SharedEnum Unused { get; set; }
}
共享類別庫僅包含以下內容:
namespace SharedClassLibrary
{
public enum SharedEnum
{
Zero = 0,
One = 1
}
}
FileNotFoundException即使在進入 Main() 方法之前,在沒有共享 DLL 的情況下運行此程式也會引發關于缺少 DLL的抱怨。
所以解決方案是將程式集放在您的可執行檔案旁邊,我不知道您為什么要涉及自己的程式集加載代碼。
原因是 JIT,想要了解有關Main()方法中使用的型別的所有資訊。使用這種型別Foo,為了實體化它,運行時必須知道關于 的一切Foo,以便能夠為實體分配記憶體。
一部分Foo是列舉,并且由于列舉可以從具有不同大小(一個位元組或更多)的各種數字型別繼承,運行時想要查找列舉的定義,因此必須加載程式集。
解決方法是使用新方法實體化您的表單:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve = AssemblyResolveHandler;
Console.WriteLine("In Main()");
RunApplication();
}
private static void RunApplication()
{
_ = new Foo();
// or in your case, Application.Run(new MainForm());
}
這表明我的自定義程式集決議器被命中:
在主()
未處理的例外。System.IO.FileLoadException:無法加載檔案或程式集“SharedClassLibrary,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”。未實作 (0x80004001 (E_NOTIMPL)) 檔案名:'SharedClassLibrary,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null'
---> System.NotImplementedException:恐怕我不能那樣做,戴夫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318265.html
