Saya harus melakukan ini beberapa kali dan telah meneliti banyak solusi berbeda.
Solusi yang saya temukan paling elegan dan mudah dicapai dapat diterapkan seperti itu.
1. Buat proyek yang Anda dapat membuat antarmuka sederhana
antarmuka akan berisi tanda tangan dari setiap anggota yang ingin Anda panggil.
public interface IExampleProxy
{
string HelloWorld( string name );
}
Sangat penting untuk menjaga proyek ini tetap bersih dan ringan. Ini adalah proyek yang AppDomain
dapat menjadi referensi dan memungkinkan kita untuk tidak merujuk Assembly
pada domain yang ingin kita muat dalam domain terpisah dari perakitan klien kita.
2. Sekarang buat proyek yang memiliki kode yang ingin Anda muat secara terpisah AppDomain
.
Proyek ini seperti proyek klien akan mereferensikan proj proxy dan Anda akan mengimplementasikan antarmuka.
public interface Example : MarshalByRefObject, IExampleProxy
{
public string HelloWorld( string name )
{
return $"Hello '{ name }'";
}
}
3. Selanjutnya, dalam proyek klien, muat kode lain AppDomain
.
Jadi, sekarang kita buat yang baru AppDomain
. Dapat menentukan lokasi dasar untuk referensi perakitan. Probing akan memeriksa rakitan dependen di GAC dan di direktori saat ini dan lokasi AppDomain
basis.
// 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 );
jika perlu, ada banyak cara berbeda untuk memuat rakitan. Anda dapat menggunakan cara berbeda dengan solusi ini. Jika Anda memiliki nama yang memenuhi syarat rakitan maka saya suka menggunakan CreateInstanceAndUnwrap
karena memuat byte rakitan dan kemudian memberi contoh jenis Anda untuk Anda dan mengembalikan object
yang Anda dapat dengan mudah dilemparkan ke jenis proxy Anda atau jika Anda tidak memasukkannya ke dalam kode yang diketik dengan kuat Anda bisa gunakan runtime bahasa dinamis dan tetapkan objek yang dikembalikan ke dynamic
variabel yang diketik, lalu panggil anggotanya secara langsung.
Itu dia.
Hal ini memungkinkan untuk memuat rakitan yang proyek klien Anda tidak memiliki referensi secara terpisah AppDomain
dan memanggil anggota di dalamnya dari klien.
Untuk menguji, saya suka menggunakan jendela Modul di Visual Studio. Ini akan menunjukkan domain rakitan klien Anda dan semua modul yang dimuat di domain itu serta domain aplikasi baru Anda dan rakitan atau modul apa yang dimuat di domain itu.
Kuncinya adalah memastikan kode Anda diturunkan MarshalByRefObject
atau dapat diserialkan.
`MarshalByRefObject akan memungkinkan Anda untuk mengkonfigurasi masa pakai domain yang masuk. Contoh, katakanlah Anda ingin domain dihancurkan jika proxy belum dipanggil dalam 20 menit.
Saya harap ini membantu.