【问题标题】:Unmanaged C++ libraries - differences between VS2005 and VS2008?非托管 C++ 库 - VS2005 和 VS2008 之间的区别?
【发布时间】:2008-11-03 21:49:14
【问题描述】:

我先说我是一名 C# 程序员,他继承了没有文档的可怕代码。我有一个用托管代码包装的非托管 C++ 库,该库在带有 .Net 1.1 框架的 VS2003 中运行良好。我正在尝试将其升级到至少 .Net 2.0。

我有使用“MSVC 8.x”编译的非托管 C++ 库(因此相当于 VS 2005,我假设)。我一直在尝试将所有内容迁移到 VS2008,但该库在运行时仍然存在一些问题。

我的问题是:这个库应该与 VS2008 一起使用吗?或者如果库是用 VC8.x 编译的,我应该在 VS2005 中开发吗?

任何想法将不胜感激。谢谢!

【问题讨论】:

    标签: c++ visual-studio-2008 visual-studio-2005


    【解决方案1】:

    它应该可以工作,我希望您在编组方面遇到问题。可能是为 PInvoking 错误地声明的东西在 .NET 1.1 中有效,但在更高版本中无效。

    您没有说明您在运行时遇到了什么样的问题,也没有说明您如何访问您的库。例如,您是否将您的库与您的项目一起编译?如果是这样,您能否在 C# 项目中打开非托管调试并单步执行您遇到问题的代码?你如何调用非托管代码?是通过 PInvoke,还是您管理 C++ 包装器?

    根据我的经验,调用旧版非托管库的最佳解决方案是为使用托管 C++ 编写的旧版库添加托管包装器库。这样,您就可以为您的库提供一个托管接口,供所有 .NET 语言使用,而且您不必担心 PInvoke 签名是否正确。

    您的项目应该如下所示。

    C# 应用程序 -> 管理 C++ Wrapper DLL -> 旧版 DLL

    【讨论】:

      【解决方案2】:

      它可以依赖于 lib 所依赖的其他内容。例如,如果您在跨库接口使用 STL,那么使用与客户端不同的版本编译库将是一个坏主意。但是,如果库提供了一个简单的 C 风格函数接口,那么您应该没有问题。

      如果您有该库的源代码,那么我建议您尝试将其移植到 VS2008。一般来说,从长远来看,将所有东西都放在同一个开发环境中会少很多麻烦。

      你是如何包装非托管库的......如果它可以追溯到 VS2003,大概使用 C++ 的托管扩展。从 VS2005 开始,它现在已被弃用,并已被 C++/CLI 取代。虽然较新的编译器支持 /clr:oldSyntax 开关以仍然编译旧代码,但它肯定存在问题。我们有旧代码无法使用此开关在 VS2005(8) 上编译。

      【讨论】:

        【解决方案3】:

        --罗伯·普劳斯:
        包装器使用托管 C++,没有 PInvoke。包装器被编译成一个 DLL,然后由另一个应用程序使用(如您所示)。

        遗留代码生成图形对象。当我尝试获取图像的句柄时,我得到了一个空异常。调试器不允许我更深入地了解代码以找出原因。其他一切似乎运行正常 - 创建图像所需的其他数据对象存在并且看起来是正确的。 (对不起,我知道这仍然是一个非常模糊的描述。)

        ——罗伯·沃克:
        不幸的是,我没有源代码。 不确定“跨库接口使用 STL”。图形是否属于该类别?

        我能够使用 /clr:oldSyntax 开关让我的应用程序运行,但这就是我获得图像的空句柄的地方。我尝试进行所有修改,以便它可以使用 /clr 进行编译,但是我不断收到无法解决的链接错误。 (链接器一直抱怨找不到文件,即使这些文件在它正在查找的文件夹中。)

        【讨论】:

          猜你喜欢
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-11
          • 2012-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多