簡體   English   中英

從資源C#加載程序集

[英]Loading Assemblies from Resource C#

因此,我嘗試將所有依賴項(包括非托管的-包括非ILMerge)都保留在C#.NET 2.0的便攜式應用程序中。

首先,我通過使用File.WriteAllBytes("DLLName.dll", Propertes.Resources.dll_name)成功地將DLL寫入磁盤,因此程序可以從中讀取這些DLL,但問題是寫入它們所花費的時間以及使它們混亂造成的。

相反,我注意到Assembly.Load 這是我用來從資源中讀取依賴項到程序的代碼:

try
{
    // Load OpenHardwareMonitorLib
    Assembly.Load(Properties.Resources.lib_hardware_monitor);

    // Some computers explicitly require 32 or 64 bit versions of SQLite. Load either version depending on architecture.
    if (Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "AMD64")
    {
        // 64 bit version
        Assembly.Load(Properties.Resources.lib_sqlite_x64);
    }
    else
    {
        // 32 bit version
        Assembly.Load(Properties.Resources.lib_sqlite_x86);
    }
}
catch ...

這似乎行得通。 好吧,至少在我的電腦上。 它進入了我朋友PC上的catch塊,但我想您會這么好地寫出答案,將用一塊石頭擊中兩只鳥。

但是,這是在程序進入主應用程序后,在try / catch后從計算機上收到的錯誤:

“無法加載文件或程序集'OpenHardwareMonitorLib,版本= 0.4.0.0,文化=中性,PublicKeyToken =空”或其依賴項之一。系統找不到指定的文件。”

但是,當然,它仍在尋找實際的DLL文件。 現在,我該如何解決?

額外細節

OpenHardwareMonitorLib沒有外部依賴項。 我還更新了問題,以弄清楚在try / catch塊之后它在我的計算機上不起作用,或者所示的try / catch塊中我朋友的計算機出現故障的事實。

您正在使用Assembly.Load(byte [])重載。 通常,這是一種加載程序集的麻煩方式。 您在此處遇到的特定問題是,您正在嘗試加載混合模式的程序集。 SqlLite包含本機代碼和托管代碼。 您正在使用的重載僅支持純托管程序集。

您無法以這種方式這樣做。

我將為您的問題推薦一種簡單且通用的解決方案,該解決方案也可以在具有UAC的計算機上使用,以阻止您嘗試執行的操作。 名為“ setup.exe”的單個可執行文件。

罪魁禍首很可能是DLL而非其本身的依賴項之一。 因此,您的代碼可能沒問題,但是需要在計算機上安裝依賴項。

您可以使用fuslogvw查看錯誤。

可能是您的朋友計算機上缺少的依賴dll之一。 請使用Fusion Log Viewer進行識別

http://msdn.microsoft.com/zh-CN/library/e74a18c4(v=vs.71).aspx

暫無
暫無

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

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