Thực ra tôi đã cố gắng thực hiện một số loại cụm 'liên kết tĩnh', trong giải pháp của tôi. Vì vậy, tôi đã cố gắng như sau:Làm thế nào để tải assemby vào thời gian chạy trước khi sự kiện AssemblyResolve?
- Thêm một tài liệu tham khảo để lắp ráp của tôi với CopyLocal = false
- Thêm file .dll bản thân để giải pháp của tôi với 'liên kết Add as'
- Thêm file .dll bản thân để nguồn lực của tôi với 'Thêm Resource' - 'Thêm Existing file'
- Thêm một số loại ra khỏi lắp ráp của tôi vào Form1 như
private MyObject temp = new MyObject();
Sau các bước tôi đã nhận FileNotFoundException như mong đợi. Vì vậy, chúng ta hãy cố gắng tải lắp ráp trong AssemblyResolveEvent với hack nhanh này
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
return MyAssembly;
};
Vì vậy, công trình này! Tôi có thể tải lắp ráp của tôi từ một tập tin tài nguyên trong một AssemblyResolveEvent. Nhưng sự kiện này chỉ xảy ra, nếu nó không thể tìm thấy hội đồng của tôi ở bất cứ nơi nào khác. Nhưng làm thế nào tôi có thể nhận được lắp ráp của tôi được nạp trước khi. Net cố gắng để tìm kiếm những nơi khác nhau ??
Do các sự kiện từ Checking for Previously Referenced Assemblies tôi nghĩ rằng nó có thể tải lắp ráp trước đó vào miền và điều này sẽ được thực hiện.
tôi đã cố gắng này trong vòng program.cs bằng cách sử dụng phương pháp
static void Main()
{
LoadMyAssemblies();
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadMyAssemblies();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static Assembly LoadMyAssemblies()
{
Assembly result = AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);
return result;
}
sau Main() Nhưng nó vẫn chạy vào ResolveEventHandler. Và tốt hơn nhiều, nếu tôi tải lại lắp ráp và xem xét AppDomain.CurrentDomain.GetAssemblies() tôi có thể thấy rằng lắp ráp của tôi được nạp hai lần !!
Vì vậy, bất kỳ ý tưởng nào tại sao hội đồng được tải của tôi sẽ không được tính đến khi nó được tải trước sự kiện AssemblyResolve ?? Với sự giúp đỡ của trình gỡ rối tôi cũng trả về một null khi cuộc gọi đến từ AssemblyResolve, nhưng trong trường hợp này tôi nhận được một FileNotFoundException như lúc đầu.
ILMerge sẽ được sử dụng trong một số trường hợp khác, nhưng trong trường hợp này, đó không phải là giải pháp 'tốt nhất'. Đưa ra trong AssemblyResolve cùng một lắp ráp trở lại cũng không phải là một giải pháp tốt, bởi vì nếu cùng một hội đồng cũng nằm trong thư mục chương trình hoặc GAC này sẽ được thực hiện và sự kiện này sẽ không được ném. – Oliver