簡體   English   中英

C#:如何將DLL嵌入到resourcefile中(程序目錄中沒有dll復制)

[英]C#: How to embed DLL into resourcefile (no dll copy in program directory)

我有一個需要X.dll的C#應用​​程序(項目A)。 我已經將生成X.dll的項目添加到A中,以作為Visual Studio中的參考。 我還已將X.dll的發行版作為二進制文件添加到A中的資源文件中。 我已經告訴項目A 不要將X.dll復制到輸出目錄。

現在,我要加載A.exe,說“嘿,我找不到此文件”,然后在資源文件中查找並使用Assembly.Load(byte [])返回X.dll。 我有重新將DLL簡化的代碼,但是從未調用過此代碼。

目前,我有一個簡單的項目,只是試圖使其工作。 編譯OK。 運行它時,我在X.dll上收到FileNotFoundException。

我有:

[STAThread]
static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

但是* CurrentDomain_AssemblyResolve *中的斷點永遠不會命中。 我立即得到FileNotFoundException。 當然有我缺少的東西嗎?

這個問題似乎與您要解決的問題非常相似,並且對提問者有用。

將.dll合並到C#匯編中?

您在做其他事情嗎? 具體來說,如果您要定位的是.NET Framework的較舊版本,則可能是了解為什么您的應用程序行為不同的提示。

另一個方向是,使用諸如Fusion Log Viewer之類的工具來分析嘗試加載程序集時發生的情況。 這可能會提供更多提示。 如果您設法獲取日志信息,則將其發布到問題中可能會幫助某人弄清楚它。

編輯:在您的評論之后的另一種解釋。

好吧,現在我想我知道問題出在哪里。

在您的Main方法中,您引用的是其他dll中的類型。 但是,您是在靜態代碼中執行此操作的,即您在代碼中顯式使用了類型(而不是通過名稱動態加載類型)。

為什么這是個問題? CLR嘗試加載程序集以便JIT Main本身。

在編譯Main時拋出了FileNotFoundException Main甚至沒有開始運行,因此未注冊您的事件處理程序。

一種檢查我是否正確的簡單方法是將代碼更改為如下所示:

static public void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += MyEventHandler;
    MyMain();
}

// The CLR will actually try to load your assembly before even starting the execution
// of this method. It needs the assembly in order to JIT the method because it has to 
// know the Thing type.
static public void MyMain()
{
    using(var thing = new Thing())
    {
         // ...
    }
}

重要的區別是Main不依賴於另一個程序集,因此JIT並運行它不會有問題。

MyMain進行JIT時,您的事件處理程序已經到位,因此您可以手動加載程序集。

順便說一句,為避免另一個可能的類似陷阱,請確保在其中定義Main的類中不包含來自另一個程序集的類型的任何字段,因為在這種情況下,CLR還將嘗試在Main之前加載程序集啟動,以進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM