Tôi đang cố gắng tải các hội đồng trong một miền ứng dụng riêng biệt, nhưng đang chạy vào một vấn đề rất lạ. Dưới đây là một số mã:Tải tập hợp vào AppDomain riêng biệt, nhận InvalidCastException
public static void LoadAssembly(string assemblyPath)
{
string pathToDll = Assembly.GetCallingAssembly().CodeBase;
AppDomainSetup domainSetup = new AppDomainSetup
{
PrivateBinPath = pathToDll
};
AppDomain newDomain = AppDomain.CreateDomain("AssemblyLoader",null,domainSetup);
AssemblyLoader loader = (AssemblyLoader)newDomain.CreateInstanceFromAndUnwrap(
pathToDll,
typeof(AssemblyLoader).FullName);
}
AssemblyLoader là một lớp trong cùng một assembly như thế này, và nó được thừa hưởng từ MarshalByRef, tuy nhiên vì một lý do kỳ lạ, tôi nhận được một ngoại lệ cast mỗi khi tôi cố gắng chạy này. Tôi thậm chí còn hardcoded đường dẫn đến DLL thay vì sử dụng GetCallingAssembly() CodeBase nhưng tôi tiếp tục nhận được ngoại lệ này.
Tôi hiểu khó trả lời câu hỏi như thế này mà không thực sự nhìn thấy và có thêm thông tin, nhưng có thể ai đó đã gặp phải tình huống tương tự và biết "gotchas" phổ biến và những gì tôi nên tìm.
EDIT: Lý do tôi không muốn tải trực tiếp là vì đây chỉ là một phần của mã. Mục tiêu cuối cùng là lớp này sẽ có một phương thức nạp assembly, nhận GUID của họ và một số thông tin khác về chúng và lưu trữ chúng trong một cơ sở dữ liệu cho một dự án mà tôi đang làm việc. Do đó, nếu tôi tải bản lắp ráp này trong miền ứng dụng riêng biệt, tôi có thể tải những người khác ở đó và sau đó tải miền ứng dụng xuống. Không có điểm trong việc có tất cả các hội đồng này được tải trong suốt thời gian của ứng dụng, nếu tôi chỉ cần dữ liệu đó.
Nếu lớp AssemblyLoader nằm trong cùng một assembly như thế này, tại sao bạn lại cố tải nó từ newDomain? Tại sao không chỉ tạo ra nó trực tiếp? –
Đó là cách tải gián tiếp các plugin. Nếu phiên bản trình tải ở trong miền ứng dụng chính, bạn tạo phiên bản trong miền ứng dụng nước ngoài và yêu cầu tải phiên bản mà bạn quan tâm. Điều này ngăn các plugin của bạn không cần biết liệu họ có thể được xử lý bởi một miền ứng dụng riêng biệt. (tức là lấy từ MarshalByRefObject) Điều này giúp các quyết định thiết kế linh hoạt (ví dụ: Tạo lớp cơ sở trình cắm thêm cung cấp tất cả chức năng được chia sẻ cho các plugin.) –