Soo*_*nts 17 c# windows 64-bit c++-cli
我是Windows开发人员,我正在使用Microsoft visual studio 2008 SP1.我的开发者机器是64位.
我目前正在处理的软件是用C#编写的.exe文件.不幸的是,我无法仅在C#中解决整个问题.这就是我在C++/CLI中开发了一个小型托管DLL的原因.两个项目都在同一个解决方案中.
我的C#.exe构建目标是"任何CPU".当我的C++ DLL构建目标是"x86"时,不加载DLL.据我所知,当我用Google搜索时,原因是C++/CLI语言与其他.NET语言不同,它编译为本机代码,而不是托管代码.
我将C++ DLL构建目标切换到x64,现在一切正常.但是,一旦我的客户端将我的产品安装在32位操作系统上,AFAIK的所有内容都将停止工作.我必须支持Windows Vista和7,它们各自的32位和64位版本.
我不想回落到32位.我的DLL中的250行C++代码只占我代码库的2%.并且该DLL仅在几个地方使用,因此在典型的使用场景中它甚至都没有加载.
我的DLL用ATL实现了两个COM对象,所以我不能使用" / clr:safe "项目设置.
有没有办法来配置解决方案和项目,使C#项目建立"任何CPU"版本中,C++项目建立两个 32位和64位版本,然后在运行时管理.EXE启动时,它使用的是32 -bit DLL或64位DLL取决于操作系统?
或者也许有一些我不知道的更好的解决方案?
提前致谢!
gat*_*ich 10
有一种方法:每个体系结构都有一个"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... */
}
}
Run Code Online (Sandbox Code Playgroud)
在C++代码中,我使用与我所说的相同的源代码,但是根据构建体系结构将编译到不同的命名空间:
#ifdef _M_X64
namespace Cpp64 {
#else
namespace Cpp32 {
#endif
public ref class MyCPlusPlusClass
{
public: static __int64 Method(void) { return 123; }
};
}
Run Code Online (Sandbox Code Playgroud)
小智 7
没有简单的方法.如果您有本机代码(即您的C++)并且您需要支持x86,那么您必须编译x86(除非您想在WOW世界中工作...即在32位和64位环境中运行32位代码).你可以同时拥有x86和x64发行版,但是如果你同时支持32位和64位,并且你有本机代码或COM introp'那么你必须同时拥有32位和64位二进制文件."任何CPU"只有在没有本机代码或互操作时才真正有用,那么你就能获得好处.
| 归档时间: |
|
| 查看次数: |
11195 次 |
| 最近记录: |