SORU
18 Mart 2009, ÇARŞAMBA


Nasıl Kurul tüm başvuruları ile yinelemeli olarak Uygulama Yüklemek için?

Yeni bir Uygulama etki alanı için başvurular karmaşık bir ağaç olan bazı derleme yüklemek istiyorum (MyDll.dll ->Microsoft.Office.Interop.Excel.dll ->Microsoft.Vbe.Interop.dll ->Office.dll ->stdole.dll)

Derleme Uygulama için yüklenmiş olduğunda anladığım kadarıyla, başvuruları otomatik olarak yüklenmez, ve manuel yük var. Ben ne zaman bu kadar:

string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory
string path = System.IO.Path.Combine(dir, "MyDll.dll");

AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = dir;
AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);

domain.Load(AssemblyName.GetAssemblyName(path));

ve FileNotFoundException var:

Dosya yüklenemedi veya derleme', MyDll Version=1.0.0.0,=, Kültür tarafsız=PublicKeyToken null' ya da bağımlılıklarından biri. Sistem belirtilen dosyayı bulamıyor.

Anahtar kelime olduğunu düşünüyorumbağımlılıklarından biri.

Tamam, domain.Load(AssemblyName.GetAssemblyName(path)); Daha önce ... ... yapacağım

foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
{
    domain.Load(refAsmName);
}

Ama 7* *tekrar, birbiriyle Kurul.

Nasıl tüm başvurular yinelemeli olarak yüklemek için?

Kök Meclisi yüklemeden önce başvurular ağacı oluşturmak zorunda mıyım? Nasıl yükleme olmadan bir derleme başvuruları almak için?

CEVAP
13 Kasım 2012, Salı


Proxy nesnesi yabancı uygulama etki alanında yürütülür önce CreateInstanceAndUnwrap çağırmak gerekir.

 class Program
{
    static void Main(string[] args)
    {
        AppDomainSetup domaininfo = new AppDomainSetup();
        domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
        Evidence adevidence = AppDomain.CurrentDomain.Evidence;
        AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);

        Type type = typeof(Proxy);
        var value = (Proxy)domain.CreateInstanceAndUnwrap(
            type.Assembly.FullName,
            type.FullName);

        var assembly = value.GetAssembly(args[0]);
        // AppDomain.Unload(domain);
    }
}

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFile(assemblyPath);
        }
        catch (Exception)
        {
            return null;
            // throw new InvalidOperationException(ex);
        }
    }
}

Ayrıca, eğer kullandığınız LoadFrom olacak muhtemel bir FileNotFound özel durum nedeniyle Meclis çözümleyici olacak girişimi bulmak için derleme yükleme içinde GAC veya mevcut uygulamanın bin klasörü. LoadFile keyfi bir montaj dosyası yerine--yüklemek için kullanın ama eğer bunu yaparsanız, herhangi bir bağımlılıkları kendiniz yüklemek gerekir unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • Hollyscoop

    Hollyscoop

    30 Ocak 2007
  • Press Start

    Press Start

    4 HAZİRAN 2006