将CLR程序集(带有非托管代码)作为C#exe中的嵌入式资源加载

时间:2018-05-02 19:16:16

标签: c# clr embedded-resource unmanaged managed

我希望将CLR程序集作为嵌入式资源存储在我的C#应用​​程序中,并在运行时加载。 我将dll作为嵌入式资源包含在内,并尝试在运行时检索数据字节并按如下方式加载程序集

        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.MyCLRAssembly.dll"))
        {
            byte[] assemblyData = new byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        }

然而,这失败,报告

Attempt to load an unverifiable executable with fixups (IAT with more than 2 sections or a TLS section.) (Exception from HRESULT: 0x80131019)

为防止出现此错误,需要使用/ CLR:Pure开关编译CLR dll,但这是不可能的,因为CLR dll包含非托管代码。

因此,我尝试了另一种解决方案来解压缩程序集并将其复制到用户AppData路径中的临时文件夹,然后相应地设置PATH变量。当应用程序尝试访问CLR程序集时,此失败的报告文件未找到异常。我可以复制到C#应用程序的安装路径,这样运行正常但不在远程文件夹中。

作为测试,我将CLR dll复制到PATH变量中的文件夹,但是失败了。有人能告诉我我做错了什么吗?该问题是否与程序集类型的差异有关,即C#程序集加载具有托管和非托管C ++的程序集。

感谢。

0 个答案:

没有答案