非托管C ++库 - VS2005和VS2008之间的区别?

时间:2008-11-03 21:49:14

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

我先说这是一个C#程序员,他继承了没有文档的可怕代码。我有一个非托管的C ++库,包含托管代码,在VS2003中使用.Net 1.1 Framework正常工作。我试图让它升级到至少.Net 2.0。

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

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

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

3 个答案:

答案 0 :(得分:2)

它应该有用,我希望你的编组有问题。可能是PInvoking声明错误的东西设法在.NET 1.1中工作但在更高版本中没有。

您没有说出您在运行时遇到的问题,也没有说明您如何访问您的库。例如,您是否与项目一起编译库?如果是这样,你可以打开C#项目中的非托管调试并进入你遇到问题的代码吗?你是如何调用非托管代码的?是通过PInvoke,还是你有托管的C ++包装器?

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

你的项目应该是这样的。

C#应用程序 - >管理C ++包装器DLL - >旧版DLL

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

- Rob Prouse:
包装器使用托管C ++,没有PInvoke。包装器被编译成一个DLL,然后由另一个应用程序使用(如图所示)。

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

- 罗布沃克:
遗憾的是我没有源代码。 不确定“跨库接口使用STL”。图形是否属于该类别?

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