从资源C#加载程序集

时间:2012-04-18 15:50:42

标签: c# reflection .net-assembly

所以我试图在C#.NET 2.0中的可移植应用程序中保留所有依赖项(包括非托管 - 所以没有ILMerge)。

起初,我使用File.WriteAllBytes("DLLName.dll", Propertes.Resources.dll_name)成功地将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 ...

这似乎工作正常。好吧,至少在我的电脑上。它进入了我朋友的电脑上的捕捉区,但我认为你会非常友好地写下这些答案会一举击中两只鸟。

但是,当程序进入主应用程序时,这是我在try / catch之后从我的计算机得到的错误:

“无法加载文件或程序集'OpenHardwareMonitorLib,Version = 0.4.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。系统找不到指定的文件。”

但当然,它仍然在寻找实际的DLL文件。现在,我该如何解决这个问题?

其他详细信息

OpenHardwareMonitorLib没有外部依赖项。我还更新了这个问题,以便明确说明在 try / catch块之后我的计算机上没有工作的事实,也没有我的朋友的计算机 in 显示的try / catch块。

3 个答案:

答案 0 :(得分:1)

您正在使用Assembly.Load(byte [])重载。这是加载程序集的一种非常麻烦的方法。您在这里遇到的具体问题是您正在尝试加载混合模式程序集。 SqlLite包含本机代码和托管代码。您使用的重载仅支持纯托管程序集。

你不能这样做。

我会为您的问题推荐简单而通用的解决方案,该解决方案也可以在具有UAC的计算机上运行,​​以阻止您尝试执行此操作。一个名为“setup.exe”的可执行文件。

答案 1 :(得分:0)

罪魁祸首很可能是DLL的依赖,而不是自身。所以你的代码可能没问题,但需要在机器上安装依赖项。

您可以使用fuslogvw查看错误。

答案 2 :(得分:0)

可能是您朋友计算机上缺少的依赖dll之一。请使用Fusion Log Viewer识别它们

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