C# 从资源C加载程序集#

C# 从资源C加载程序集#,c#,reflection,.net-assembly,C#,Reflection,.net Assembly,因此,我试图在C#.NET2.0中的可移植应用程序中保留所有依赖项(包括非托管-因此没有ILMerge) 起初,我通过使用File.writealBytes(“DLLName.dll”,Propertes.Resources.dll\u name)成功地将dll写入磁盘,这样程序就可以从中读取,但问题是写入它们所花费的时间以及它所造成的混乱 相反,我注意到Assembly.Load。这是我用来将依赖项从我的资源读入程序的代码: try { // Load OpenHardwareMoni

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

起初,我通过使用
File.writealBytes(“DLLName.dll”,Propertes.Resources.dll\u 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,版本=0.4.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件

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

其他细节
OpenHardwareMonitorLib没有外部依赖项。我还更新了这个问题,以明确在try/catch块之后,它在我的计算机上不工作,也不在显示的try/catch块中出现故障的朋友的计算机上工作。

罪魁祸首很可能是DLL的依赖项之一,而不是DLL本身。因此,您的代码可能还可以,但需要在计算机上安装依赖项


您可以使用查看错误。

罪魁祸首很可能是DLL的依赖项之一,而不是DLL本身。因此,您的代码可能还可以,但需要在计算机上安装依赖项


您可以使用查看错误。

可能是您的好友计算机上缺少的依赖dll之一。请使用Fusion日志查看器来识别它们


可能是您朋友计算机上缺少的依赖dll之一。请使用Fusion日志查看器来识别它们


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

你不能这样做


我会推荐一个简单而通用的解决方案来解决你的问题,这个解决方案同样适用于那些有UAC来阻止你尝试做什么的机器。名为“setup.exe”的单个可执行文件。

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

你不能这样做



我会推荐一个简单而通用的解决方案来解决你的问题,这个解决方案同样适用于那些有UAC来阻止你尝试做什么的机器。一个名为“setup.exe”的可执行文件。

可执行文件中是否有所有依赖项?您的旧可执行文件(保存文件)在您朋友的机器上工作吗?@xxbbcc是。可执行文件在我们的两台计算机上都是独立工作的,当它使用磁盘写入方法时。更新:我最终使用了另一种方法,在程序运行时,我会动态地将DLL文件写入工作目录,但仅当文件需要更改时才这样做。可执行文件中是否有所有依赖项?您的旧可执行文件(保存文件)在您朋友的机器上工作吗?@xxbbcc是。当使用磁盘写入方法时,可执行文件在我们两台计算机上都可以独立工作。更新:我最终使用了另一种方法,即在程序运行时,动态地将DLL文件写入工作目录,但仅当文件需要更改时才这样做。我想我们两人都没有fuslogvw?我有,我不关心你。问题澄清:我不认为你意识到它在我的电脑上也不能正常工作。我不认为我们两人都有fuslogvw?我有,我不关心你。问题澄清:我不认为你意识到它在我的电脑上也不能正常工作。谢谢你,我将研究其他一些加载DLL的替代方案;然而,我怀疑我面临的问题完全是混合模式。开放硬件并非如此,但这正是我在机器上遇到的困难“安装”是一个很好的主意,但对于我严格的可移植应用程序来说并不是一个真正的选项。这确实让我停顿了一下。使用本机代码的便携式应用程序?还有一个名称中有“硬件”但不使用本机代码的DLL?我完全同意。计算机有一种技能,可以在不怀恨在心的情况下将二乘四运算到你的额头上。因此,我需要的是类似于[DllImport()]的东西,但如何使用原始字节而不是字符串文件名来执行类似的操作呢?谢谢,我将研究其他加载DLL的方法;然而,我怀疑我面临的问题完全是混合模式。开放硬件并非如此,但这正是我在机器上遇到的困难“安装”是一个很好的主意,但对于我严格的可移植应用程序来说并不是一个真正的选项。这确实让我停顿了一下。使用本机代码的便携式应用程序?还有一个名称中有“硬件”但不使用本机代码的DLL?我完全同意。计算机有一个诀窍,可以在不怀恨在心的情况下将二乘四运算到你的额头上。因此,我需要的是类似于[DllImport()]的东西,但是我如何才能用原始字节而不是字符串文件名来做这样的事情呢?