Tôi đã phải làm điều này vài lần và đã nghiên cứu nhiều giải pháp khác nhau.
Giải pháp mà tôi thấy thanh lịch và dễ thực hiện nhất có thể được thực hiện như vậy.
1. Tạo một dự án mà bạn có thể tạo một giao diện đơn giản
giao diện sẽ chứa chữ ký của bất kỳ thành viên nào bạn muốn gọi.
public interface IExampleProxy
{
string HelloWorld( string name );
}
Điều quan trọng là giữ cho dự án này sạch sẽ và gọn gàng. Đây là một dự án mà cả hai đều AppDomain
có thể tham chiếu và sẽ cho phép chúng tôi không tham chiếu đến miền Assembly
mà chúng tôi muốn tải trong miền riêng từ hội đồng khách hàng của chúng tôi.
2. Bây giờ tạo dự án có mã bạn muốn tải riêng biệt AppDomain
.
Dự án này cũng như với proj máy khách sẽ tham chiếu đến proxy proj và bạn sẽ triển khai giao diện.
public interface Example : MarshalByRefObject, IExampleProxy
{
public string HelloWorld( string name )
{
return $"Hello '{ name }'";
}
}
3. Tiếp theo, trong dự án máy khách, tải mã trong một dự án khác AppDomain
.
Vì vậy, bây giờ chúng tôi tạo một cái mới AppDomain
. Có thể chỉ định vị trí cơ sở cho các tham chiếu lắp ráp. Việc dò tìm sẽ kiểm tra các tập hợp phụ thuộc trong GAC và trong thư mục hiện tại và AppDomain
loc cơ sở.
// set up domain and create
AppDomainSetup domaininfo = new AppDomainSetup
{
ApplicationBase = System.Environment.CurrentDirectory
};
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain exampleDomain = AppDomain.CreateDomain("Example", adevidence, domaininfo);
// assembly ant data names
var assemblyName = "<AssemblyName>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null|<keyIfSigned>";
var exampleTypeName = "Example";
// Optional - get a reflection only assembly type reference
var @type = Assembly.ReflectionOnlyLoad( assemblyName ).GetType( exampleTypeName );
// create a instance of the `Example` and assign to proxy type variable
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( assemblyName, exampleTypeName );
// Optional - if you got a type ref
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( @type.Assembly.Name, @type.Name );
// call any members you wish
var stringFromOtherAd = proxy.HelloWorld( "Tommy" );
// unload the `AppDomain`
AppDomain.Unload( exampleDomain );
nếu bạn cần, có rất nhiều cách khác nhau để tải một tổ hợp. Bạn có thể sử dụng một cách khác với giải pháp này. Nếu bạn có tên đủ điều kiện lắp ráp thì tôi muốn sử dụng CreateInstanceAndUnwrap
vì nó tải các byte lắp ráp và sau đó khởi tạo loại của bạn cho bạn và trả về một loại object
mà bạn có thể truyền đơn giản đến loại proxy của mình hoặc nếu bạn không có tên đó thành mã được nhập mạnh, bạn có thể sử dụng thời gian chạy ngôn ngữ động và gán đối tượng trả về cho một dynamic
biến đã định kiểu, sau đó chỉ cần gọi trực tiếp các thành viên trên đó.
Đây là bạn có nó.
Điều này cho phép tải một assembly mà chương trình khách hàng của bạn không có tham chiếu đến trong một vùng riêng biệt AppDomain
và gọi các thành viên trên đó từ ứng dụng khách.
Để kiểm tra, tôi muốn sử dụng cửa sổ Mô-đun trong Visual Studio. Nó sẽ hiển thị cho bạn miền lắp ráp máy khách của bạn và tất cả các mô-đun được tải trong miền đó cũng như miền ứng dụng mới của bạn và những cụm hoặc mô-đun nào được tải trong miền đó.
Điều quan trọng là phải đảm bảo mã của bạn có nguồn gốc MarshalByRefObject
hoặc có thể tuần tự hóa.
`MarshalByRefObject sẽ cho phép bạn định cấu hình thời gian tồn tại của miền. Ví dụ: giả sử bạn muốn miền bị hủy nếu proxy không được gọi trong 20 phút.
Tôi hi vọng cái này giúp được.