【问题标题】:compiling a .net application with either a 32-bit or 64-bit dll使用 32 位或 64 位 dll 编译 .net 应用程序
【发布时间】:2010-08-18 22:59:37
【问题描述】:

我有一个我们在这里编写的应用程序,它使用 SharpSVN 包装器用于 SVN。在过去的几年里,它为我们提供了很好的服务。但是,我们已经开始引入 64 位系统,我们的应用程序似乎无法访问这些系统上的 SharpSVN dll。

我已经下载了 SharpSVN dll 的 64 位版本,我想知道下一步该做什么。我无法阻止我的 32 位用户使用该应用程序,因此我需要能够为这两个平台进行编译。幸运的是,通过这个应用程序,我们将 ntier 堆栈的不同层拆分为解决方案中的单独项目,因此我使用 SharpSVN dll 的业务层是独立的。

如何在不维护项目的两个副本的情况下同时编译我的应用程序的 32 位和 64 位版本?

【问题讨论】:

    标签: vb.net 32bit-64bit sharpsvn


    【解决方案1】:

    使用 x86 平台(而不是任何 CPU)构建您的工具,即使在 64 位系统上,它也会作为 x86 代码加载。

    或者你可以做类似的事情

    class SharpSvn64 {
        [DllImport("sharpsvn64.dll")] extern public static void DoSomething();
    }
    
    class SharpSvn32 {
        [DllImport("sharpsvn32.dll")] extern public static void DoSomething();
    }
    
    class SharpSvn {
        static readonly bool Is64 = (IntPtr.Size == 8);
    
        void DoSomething() {
            if (Is64)
                SharpSvn64.DoSomething();
            else
                SharpSvn32.DoSomething();
        }
    }
    

    编辑: 由于 SharpSVN 是托管的,PInvoke 不会是答案,因此构建 x86 可执行文件可能是方法。或者,如果界面相同,您可以订阅 AddDomain.AssemblyResolve 事件并选择您想要的程序集。不过,我不知道这是否是个好主意。

    【讨论】:

    • 因为 SharpSVN 是用 .Net 编写的,所以我参考了 dll。不是非托管代码的 PInvoke 方法吗?
    • 如下图,将项目改成x86平台导致应用在加载时挂起。
    • 对不起,我想这取决于你的排序。回应马克威尔金斯的另一个回答。
    【解决方案2】:

    根据描述,听起来您的 vb.net 应用程序是使用 Any CPU 选项构建的,这意味着它将作为 64 位应用程序在 64 位机器上运行。在这种情况下,它不会加载 32 位 DLL。

    与其尝试同时使用 32 位和 64 位版本,不如将其更改为以 32 位运行。更简单的部署。在项目属性构建选项卡下,选择x86

    【讨论】:

    • 我是否必须维护该项目的两个副本?一个使用 32,另一个使用 64?
    • @fizch,不。假设没有需要 64 位应用程序的具体原因,您只需一个可以在任一环境中运行的 32 位构建。
    • @Mark,更改我的业务层项目不起作用。当我将解决方案中的所有项目更改为 x86 时,它根本不会启动应用程序。它一直说应用停止响应。
    • @fizch,这似乎有点奇怪。它是否也停止在 32 位平台上运行?
    • 当时我没有尝试在 32 位平台上安装。好问题。我刚刚尝试编译并在我的系统上运行它,它是 32 位的,它运行成功。
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2011-03-03
    • 2013-05-19
    • 1970-01-01
    • 2014-08-15
    • 2019-05-01
    • 2020-11-25
    • 2012-01-05
    相关资源
    最近更新 更多