Assembly.Load x86 / x64 / AnyCPU

时间:2016-11-08 21:08:36

标签: c# .net build cpu-architecture

我正在设计一个客户端应用程序,它将列出我提供的几个应用程序。用户将选择应用程序,然后按下运行,然后将下载应用程序并使用Assembly.Load将其加载到客户端应用程序的域中。这是它加载的片段:

        var vAsm = Assembly.Load(client.GetBase());
        var vEP = vAsm.EntryPoint;
        var vSC = vAsm.GetType(vEP.DeclaringType.FullName).GetMethod("SetClient");
        var vInst = vAsm.CreateInstance(vEP.Name);
        vSC.Invoke(vInst, new object[] { client, license }); 
        vEP.Invoke(vInst, null);   

问题:当前的两个应用程序是32位。但是我的一个应用程序是64位。

问题:如果我在AnyCPU中构建客户端应用程序,它是否能够加载32位应用程序和64位应用程序?或者,如果机器支持它,可能有一个设置以64位启动它?这将是理想的,因为我只是检测它们是否是32位/ 64位并警告他们,如果是这样的话,他们的机器上不支持一个应用程序。

我将自己测试,但也许有人可以给我一些建议来处理这个问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

要回答您的第一个问题,如果您将应用程序编译为AnyCPU,则让Windows决定选择哪个CLR。根据我的经验,它通常适用于Windows在x64操作系统上选择x64 CLR和在x86操作系统上选择x86 CLR,但我不确定这是否始终是一种保证。 AnyCPU并不意味着它可以在两者中运行。您只能加载与加载客户端应用程序的CLR体系结构相对应的应用程序版本。

在我工作的地方工作的一些应用程序中,我不得不处理这类事情。当我尝试与为AnyCPU编译的特定体系结构和应用程序编译的应用程序进行互操作时,我遇到了一些令人沮丧的错误。为了使事情变得更容易和更可预测,我最终编译了#34; AnyCPU"必须与"非AnyCPU"互动的应用程序他们必须与之交互的每个架构的应用程序。有些人可能会有更复杂的设置,但对我来说并不值得头痛。

所以,第二个问题的答案是更多建议。我只是编译特定体系结构的客户端应用程序,以便确定您正在处理哪个体系结构,然后添加适当的代码来检测体系结构。事实上,我认为您可以使用一些编译器指令来存储某种指示器,指示您在哪个架构下运行,甚至放置一个"检测"特定于编译器指令中每个体系结构的分支,这将有助于您执行您正在考虑的警告。

另一种方法是将客户端应用程序保持为AnyCPU,并检测应用程序当前正在运行的体系结构(如果内存服务,则对于x64应用程序,它的IntPtr.Size == 8,但可能有更可靠的方法;不确定...)然后才启动相应的应用程序。但是,您必须注意,即使使用AnyCPU,您也只能加载运行AnyCPU客户端应用程序的CLR特定体系结构的应用程序。

这有意义吗?

答案 1 :(得分:0)

您应该在AnyCPU中构建所有二进制文件。这样,在64位操作系统上,它们将以64位运行,在32位操作系统上运行,它们将以32位运行。如果编译为x64,它将无法在32位操作系统上运行。如果编译为x86,即使在64位操作系统上,也总是以32位运行。最后的规则是你不能混合和在同一进程中匹配x86和x64 bin。不匹配的将无法加载。

相关问题