1

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

起初,我通过使用成功地将 DLL 写入磁盘,File.WriteAllBytes("DLLName.dll", Propertes.Resources.dll_name)以便程序可以从中读取,但问题是写入它们所花费的时间以及它造成的混乱。

相反,我注意到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 块,但我认为你写的这么好心的答案会用一块石头击中两只鸟。

但是,这是我在程序进入主应用程序时尝试/捕获后从我的计算机得到的错误:

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

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

额外细节

OpenHardwareMonitorLib 没有外部依赖项。我还更新了这个问题,以明确在try/catch 块之后它无法在的计算机上运行,​​也不是我朋友的计算机所示的 try/catch 块中失败。

4

3 回答 3

1

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

你不能这样做。

我会推荐简单而通用的解决方案来解决您的问题,该解决方案也适用于具有 UAC 以阻止您尝试执行的操作的机器。名为“setup.exe”的单个可执行文件。

于 2012-04-18T18:02:07.760 回答
0

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

您可以使用fuslogvw查看错误。

于 2012-04-18T15:56:26.103 回答
0

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

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

于 2012-04-18T15:57:20.737 回答