SORU
18 EYLÜL 2008, PERŞEMBE


Gömülü bir kaynak olarak tek bir dll içinde yerleştirmesi ve benim kod çağırmak sonra

Bende bir durum nerede var DLL ediyorum oluşturma kullanan başka bir üçüncü taraf DLL, ama ben tercih edebilmek için inşa üçüncü parti DLL DLL yerine onları muhafaza etmek hem de birlikte mümkünse.

Bu C# ve .NET 3.5.

Bu yapmak istediğim üçüncü parti ondan sonra birinci DLL DOSYASı yürütme sırasında uygun yerde gömülü bir kaynak olarak DLL saklayarak.

Ben aslında bunu yapmak için planladığım kodu üçüncü parti konumunu Sistemi tarafından belirtilen DLL koymak için yazmak.Yansıma.Derleme.() GetExecutingAssembly.Konum:() Olabilirdi eksi son /nameOfMyAssembly.dll. Başarıyla üçüncü parti kurtarabilirim .Bu konumda DLL (C:\Documents and Settings\Local Settings\Application Data\assembly dl3\KXPPAX6Y\\. myUserName olmak biter (hangi\A1MZ1499 ZCY.Kodumu bulamıyorum bu DLL gerektiren kısma geldiğimde 1TR\e0115d44\91bb86eb_fe18c901) , ama.

Herkes farklı yapmam gereken ne olduğu hakkında bir fikriniz var mı?

CEVAP
18 EYLÜL 2008, PERŞEMBE


Bir kaynak olarak üçüncü parti Meclisi gömülü bir kez, kod uygulama başlatma sırasında geçerli etki alanı AppDomain.AssemblyResolve olaya abone olmak için ekleyin. Bu olay Fusion alt sistem CLR derleme bulmak için başarısız olduğunda etkisi algılama (ilkeleri) göre patlar. AppDomain.AssemblyResolve yük olay işleyicisi kaynak Assembly.GetManifestResourceStream Assembly.Load ilgili aşırı bir bayt dizisi olarak içerik besleme. Böyle bir uygulama C istiyorum aşağıda#:

AppDomain.CurrentDomain.AssemblyResolve  = (sender, args) =>
{
    var resName = args.Name   ".dll";    
    var thisAssembly = Assembly.GetExecutingAssembly();    
    using (var input = thisAssembly.GetManifestResourceStream(resName))
    {
        return input != null 
             ? Assembly.Load(StreamToBytes(input))
             : null;
    }
};

StreamToBytes olarak tanımlanmış olabilir:

static byte[] StreamToBytes(Stream input) 
{
    var capacity = input.CanSeek ? (int) input.Length : 0;
    using (var output = new MemoryStream(capacity))
    {
        int readLength;
        var buffer = new byte[4096];

        do
        {
            readLength = input.Read(buffer, 0, buffer.Length);
            output.Write(buffer, 0, readLength);
        }
        while (readLength != 0);

        return output.ToArray();
    }
}

Son olarak, bir kaç biraz daha ilgili olsa zaten, ILMerge göz önünde başka bir seçenek olabilir, söz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • New Scientist

    New Scientis

    27 Kasım 2006
  • Toddler Fun Learning

    Toddler Fun

    8 ŞUBAT 2013
  • waterfairy17

    waterfairy17

    9 Aralık 2007