2012-03-06 40 views
11

我的目標是創建一個可啓動陰影複製應用程序的可執行文件。訣竅是,我希望這個初學者程序沒有外部依賴關係,也不必包含任何有關它必須啓動的程序的知識。C#.dll程序集是否可以包含入口點?

我也希望它是目錄中唯一的可執行文件。換句話說,我希望它「運行」.dll程序集而不是.exe程序集。 (我可以要求每次加載到一個新的AppDomain的.dll文件的名稱是相同的,像Main.dll或類似的東西)。

它看起來像AppDomain.ExecuteAssembly會做我想要的。它表示它將在「.NET Framework標題中指定的入口點」開始執行。「

當我嘗試使用該函數時,出現錯誤「在彙編'DllApp'中找不到入口點」。

起動程序我有,只是想經營組裝:

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

應用程序代碼,在一個.dll文件,使用默認的入口點:

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

This page on Main() functions說, 「圖書館和服務不需要Main方法作爲切入點」。它沒有說他們不能有一個默認入口點。

我已經試過公共/私有靜態無效的主要,一個int返回類型的所有各種排列,字串[] args作爲參數,有一個命名空間,沒有命名空間,靜態/非靜態類等

我能夠將我的代碼更改爲從MarshalByRefObject繼承,然後使用CreateInstance創建一個對象,但是似乎它會將啓動器更緊密地耦合到它應該啓動的程序。如果我可以使用ExecuteAssembly,那麼正在啓動的應用程序只需要一個靜態無效Main,而且這非常簡單,很難搞定。

是否有可能使.dll程序集有一個默認入口點,併爲ExecuteAssembly找到它,或者我只是不得不辭去自己走另一條路線?

+1

將.NET程序集(dll)的入口點本身不作爲進程啓動是沒有意義的。 – Zenwalker 2012-03-06 03:48:49

回答

17

您可以將.NET應用程序編譯爲exe(它是一個程序集),並將其重命名爲.DLL,它將作爲普通的.NET .dll程序集。它會有你的入口點。

+0

這工作完美無需改變任何東西。想知道爲什麼我沒有想到它......謝謝Keith。 – Sean 2012-03-08 14:02:40

-1

簡短的回答是沒有。 .DLL文件是一個動態鏈接的庫,它是由另一個庫調用的代碼。我想Keith說技術上會工作..只要你以適當的方式啓動應用程序,你甚至可以將它重命名爲甚至你想要的.txt或.pdf。我的主要問題是這個;你想做什麼??除非你想寫惡意軟件,你爲什麼要這麼做? 不是我寬恕寫惡意軟件的壞目的,但我知道人們喜歡在他們自己的實驗室進行實驗,所以我不會譴責它。如果你正在編寫類似C++的惡意軟件,c或彙編可能是一個更好的選擇,我猜C#可以完成這項工作,但是meh ...

+0

我的答案是,編譯器生成dll或exes,但都是程序集,它的只是exes是定義了入口點的程序集,這就是他所要求的。 – 2012-03-06 08:35:18

+1

不,沒有惡意軟件寫在這裏。我正在嘗試創建一個小型啓動程序來複制我的主應用程序。然後,我可以輕鬆地更新我的主應用程序,而無需跳過單獨的可執行文件來進行更新等。我只是想讓啓動器儘可能完全分離,然後我可以將它用於所有應用程序。 – Sean 2012-03-06 17:05:54

+0

「除非你試圖編寫惡意軟件」LOL !! – 2013-08-25 07:12:59

0

我發現建議不容易遵循。經過一番嘗試,我得到了這樣的成功:

我用一個簡單的主創建了一個控制檯應用程序,幷包含了我原始DLL中的其餘代碼。下面是一個包含DLL的簡化程序:

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; 
    } 
    } 
} 

編譯後,我將生成的.exe重命名爲.DLL。

在使用DLL的母程序中,我首先添加了DLLTest.dll作爲參考,然後添加了執行DLL的代碼。

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; 
    } 
    } 
} 

中提琴我可以執行,並在DLLTest.Main方法添加一個斷點,看看,我可以調用DLLTest的主。感謝討論夥計!

相關問題