首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#应用程序的AnyCPU/x86/x64及其C++/CLI依赖

C#应用程序的AnyCPU/x86/x64及其C++/CLI依赖
EN

Stack Overflow用户
提问于 2010-06-03 14:47:05
回答 2查看 12.4K关注 0票数 19

我是Windows开发人员,我正在使用微软的visual studio 2008 SP1。我的开发机器是64位的。

我目前正在开发的软件是用C#编写的托管.exe。不幸的是,我不能单独用C#解决整个问题。这就是为什么我还用C++/CLI开发了一个小的托管DLL。这两个项目都在同一个解决方案中。

我的C# .exe构建目标是“任何CPU”。当我的C++动态链接库构建目标是"x86“时,不加载该动态链接库。就我在谷歌上所理解的,原因是C++/CLI语言,与其他.NET语言不同,它编译为本机代码,而不是托管代码。

我将C++ DLL构建目标切换为x64,现在一切都正常了。但是,一旦我的客户端将我的产品安装在32位操作系统上,AFAIK一切都将停止工作。我必须支持Windows Vista和Windows Vista 7,它们都是32位和64位版本。

我不想退回到32位。我的DLL中的250行C++代码只占我代码库的2%。而且该DLL只在几个地方使用,所以在典型的使用场景中,它甚至不会被加载。

我的DLL用ATL实现了两个COM对象,所以我不能使用“/clr:safe(http://msdn.microsoft.com/en-us/library/85344whh(VS.80%29.aspx))”项目设置。

有没有办法配置解决方案和项目,使C#项目构建“任何CPU”版本,C++项目构建 32位和64位版本,然后在运行时,当托管.EXE启动时,它根据操作系统使用32位DLL或64位DLL?

或者也许有一些我不知道的更好的解决方案?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-04 00:13:49

没有简单的方法可以绕过它。如果你有原生代码(例如你的C++)并且你需要支持x86,那么你必须编译x86 (除非你想在WOW world...ie中工作。在32位和64位环境中运行32位代码)。你可以同时拥有x86和x64发行版,但是如果你同时支持32位和64位,并且你有本机代码或者COM介绍,那么你必须同时拥有32位和64位的二进制文件。“任何CPU”只有在没有本机代码或互操作的情况下才是真正有用的,这样你才能得到好处。

票数 8
EN

Stack Overflow用户

发布于 2012-06-22 21:02:46

有一种方法:为每个体系结构提供一个"AnyCPU“C#包装器和一个C++项目,并让C#包装器在运行时加载正确的C++项目。

对于C++项目,为每个不同的体系结构(x86、x64)创建一个版本,并构建它们。然后在包装器中这样做:

public class CppWrapper
{
    // C++ calls that will be dynamically loaded from proper architecture:
    public static readonly Func<long> MyCplusplusMethodUsableFromCsharpSpace;

    // Initialization:
    static CppWrapper()
    {
        if(Environment.Is64BitProcess)
        {
            MyCplusplusMethodUsableFromCsharpSpace = CppReferences64.MyCplusplusClass.Method;
            // Add your 64-bits entry points here...
        }
        else
        {
            MyCplusplusMethodUsableFromCsharpSpace = CppReferences32.MyCplusplusClass.Method;
            /* Initialize new 32-bits references here... */
        }
    }

    // Following classes trigger dynamic loading of the referenced C++ code
    private static class CppReferences64
    {
        public static readonly Func<long> MyCplusplusMethod = Cpp64.MyCplusplusMethod;
        /* Add any64-bits references here... */
    }
    private static class CppReferences32
    {
        public static readonly Func<long> MyCplusplusMethod = Cpp32.MyCplusplusMethod;
        /* Add any 32-bits references here... */
    }
}

在C++代码中,我使用了与我所说的相同的源代码,但将根据构建体系结构编译为不同的名称空间:

#ifdef _M_X64
namespace Cpp64 {
#else
namespace Cpp32 {
#endif
    public ref class MyCPlusPlusClass
    {
        public: static __int64 Method(void) { return 123; }
    };
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2963809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档