【问题标题】:Assembly.Load x86/x64/AnyCPUAssembly.Load x86/x64/AnyCPU
【发布时间】:2017-03-22 15:23:57
【问题描述】:

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

        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 位,并警告他们如果是这种情况,他们的机器上不支持一个应用程序。

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

谢谢!

【问题讨论】:

  • 请在您的问题中输入代码with formatting。这使每个人都可以查看并轻松为您编辑现有代码,并使问题/答案更具可读性。

标签: c# .net build cpu-architecture


【解决方案1】:

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

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

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

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

这有意义吗?

【讨论】:

  • 是的!这确实是有道理的。而且我肯定会在允许它们运行 64 位应用程序之前对架构进行检查。所以最后我必须做一些实验。而且我总是可以像某些人一样发布 32 位和 64 位客户端。
  • 很高兴这是有道理的。实验会很好。有几种不同的方法可以完成这项工作,您必须找出最适合您的方法。 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2013-07-19
    相关资源
    最近更新 更多