2012-03-06 30 views
11

Amacım, gölge kopyalanmış bir uygulama başlatan bir yürütülebilir dosya oluşturmaktır. İşin sırrı, bu başlangıç ​​programının harici bir bağımlılığa sahip olmamasını ve başlatması gereken program hakkında bilgi sahibi olmamasını istiyorum.C# .dll derlemesi bir giriş noktası içerebilir mi?

Ayrıca dizindeki tek yürütülebilir dosya olmasını istiyorum. Başka bir deyişle, bir .dll derlemesi bir .exe derleme "çalıştırmak" istiyorum. (Ben, yeni bir AppDomain içine yüklenen .dll dosyasının adı her zaman, Main.dll veya bunun gibi bir şey aynı olması gerekir.)

Tam olarak istediklerimi yapar gibi görünüyordu AppDomain.ExecuteAssembly. ".NET Framework üstbilgisinde belirtilen giriş noktasında" çalışmaya başlayacağını söylüyor.

Bu işlevi kullanmaya çalıştığımda "Giriş noktası," DllApp "grubunda bulunamadı" hatasını alıyorum.

Ben marş programı, sadece montaj çalıştırmaya çalışırken:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

This page on Main() functions söylüyor: varsayılan giriş noktası ile,

static void Main() 
{ 
    AppDomain domain = AppDomain.CreateDomain("DllApp"); 
    domain.ExecuteAssembly("DllApp.dll"); 
} 

uygulama kodunu, bir .dll dosyasında "Kütüphaneler ve hizmetler giriş noktası olarak Ana yöntem gerektirmez". 'un'un da varsayılan bir giriş noktasına sahip olmadığını söylemez.

ben kamu/özel void ana, bir int dönüş türünün tüm çeşitli permütasyon denedi, dize [] vb ad, hiçbir ad, statik/statik olmayan sınıf,

ile argümanlar olarak args

Kodumu MarshalByRefObject öğesinden devralmak için değiştirdim ve sonra bir nesne oluşturmak için CreateInstance'ı kullanabildim, ancak başlatıcının başlattığı programa daha sıkı bir şekilde bağlanacağı anlaşılıyor. ExecuteAssembly'ı kullanabilseydim, başlatılan uygulama sadece bir statik boş Main'a ihtiyaç duyardı, ve bu gerçekten basit ve dağınıklık için çok zor.

Bir .dll derlemesinin varsayılan bir giriş noktasına sahip olması ve bunu bulmak için ExecuteAssembly için mi yoksa yalnızca başka bir rotaya geçmek için kendimi istifa etmem gerekiyor mu?

+1

Kendisi bir süreç olarak başlatılmadığı için, bir .NET derlemesi (dll) için bir giriş noktası olması mantıklı değildir. – Zenwalker

cevap

17

Bir .NET uygulamasını bir exe (derleme) olarak derleyebilir ve bir .DLL olarak yeniden adlandırabilirsiniz ve normal bir .NET .dll derlemesi gibi davranır. Daha sonra giriş noktanız olacak.

+0

Bu, başka bir şey değiştirmek zorunda kalmadan mükemmel bir şekilde çalıştı. Merak etmediğimi merak ediyorum ... Teşekkürler Keith. – Sean

-1

Kısa cevap yok. .DLL dosyası, başka bir kitaplık tarafından çağrılan kod olan dinamik olarak bağlantılı bir kitaplıktır. Keith'in teknik olarak işe yarayacağını tahmin ediyorum. Uygulamayı uygun bir şekilde başlattığınız sürece .txt veya .pdf bile istediğinizi istediğiniz gibi yeniden adlandırabilirsiniz. Sahip olduğum ana soru şu; Ne yapmaya çalışıyorsun?? Kötü amaçlı yazılım yazmaya çalışmıyorsan, bunu neden yapmak isterdin? Kötü amaçlı yazılımların kötü amaçlarla yazılmasını sağladığımdan emin değilim, ancak insanların kendi laboratuarlarında deney yapmayı sevdiğini biliyorum. Eğer C++, c veya assembler gibi bir şey yazıyorsanız, daha iyi bir bahis olabilir C# işini bitirebilirim ama meh ...

+0

point cevabı, derleyicinin dll veya exes ürettiğini, ancak her ikisinin de meclisleri olduğunu, sadece exes'ın, istediği şey olan, tanımlanmış bir giriş noktası olan meclisleri olduğunu. –

+1

Hayır, burada yazı yazımı yok. Ana başvurumu kopyalamak için küçük bir başlangıç ​​programı oluşturmaya çalışıyorum. Daha sonra, ana uygulamamı, güncelleme için ayrı yürütücülerin diğer çemberlerinden atlamak zorunda kalmadan kolayca güncelleyebilirim. Mümkünse başlatıcının tamamen ayrıştırılmasını istedim, sonra tüm uygulamalarım ile kullanabilirdim. – Sean

+0

"Kötü amaçlı yazılım yazmayı denemedikçe" LOL !! –

0

Tavsiyeyi takip etmek çok kolay buldum. Bazı deneyler yaptıktan sonra bu başarıya nasıl geldim:

Basit bir ana ile bir konsol uygulaması oluşturdum ve kodun geri kalanını orijinal DLL'mden aldım.Derleme sonra bir .dll için .exe oluşturulan yeniden adlandırıldı

namespace FIT.DLLTest 
{ 
    public class DLLTest 
    { 
    [STAThread] 
    static void Main(string[] args) 
    { 
     int a = 1; 
    } 

    public DLLTest() 
    { 
     int b = 17; 
    } 

    public int Add(int int1, int int2) 
    { 
     return int1 + int2; 
    } 
    } 
} 

: Aşağıda bir DLL içerir basitleştirilmiş bir programdır.

DLL kullanan ana programda, önce DLLTest.dll dosyasını bir Referans olarak ekledim, sonra DLL dosyasını çalıştırmak için kodu ekledim.

namespace TestDLLTest 
{ 
    class TestDLLTest 
    { 
    static void Main(string[] args) 
    { 
     AppDomain domain = AppDomain.CreateDomain("DLLTest"); 
     domain.ExecuteAssembly("DllTest.dll"); 

     DLLTest dt = new DLLTest(); 
     int res2 = dt.Add(6, 8); 
     int a = 1; 
    } 
    } 
} 

Viola Ben yürütmek ve DLLTest.Main yönteminde bir kesme noktası ekleyebilir ve ben DLLTest ait Main çağırmak olabilir görebiliyordu. Tartışma üyeleri için teşekkürler!

İlgili konular