所以我试图在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块。
答案 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