C# 使用另一版本的visual studio中内置的dll 我必须在C++项目中使用第三方DLL。我只知道这个dll是在Visual Studio 2013中构建的。我使用VS2010,由于各种原因无法切换到2013

C# 使用另一版本的visual studio中内置的dll 我必须在C++项目中使用第三方DLL。我只知道这个dll是在Visual Studio 2013中构建的。我使用VS2010,由于各种原因无法切换到2013,c#,c++,dll,C#,C++,Dll,所述dll导出一些返回std::string的函数。毫不奇怪,调用这些函数会在某些字符串释放代码中产生访问冲突 就我所理解的问题而言,这没什么好惊讶的,除了切换到VS2013,我也无能为力 但事情是这样的。这个第三方dll附带了一个c#示例项目,该项目可以导入它并正常工作 因此,我的问题是: (纯粹理论上的)为什么?是.NET字符串封送魔法在起作用吗 假设我将有问题的dll包装在自己的托管dll中,然后在非托管代码中使用该托管包装器。行吗 如果问题2的答案是肯定的,那么如何回答?我对c#一窍不通

所述dll导出一些返回std::string的函数。毫不奇怪,调用这些函数会在某些字符串释放代码中产生访问冲突

就我所理解的问题而言,这没什么好惊讶的,除了切换到VS2013,我也无能为力

但事情是这样的。这个第三方dll附带了一个c#示例项目,该项目可以导入它并正常工作

因此,我的问题是:

  • (纯粹理论上的)为什么?是.NET字符串封送魔法在起作用吗

  • 假设我将有问题的dll包装在自己的托管dll中,然后在非托管代码中使用该托管包装器。行吗

  • 如果问题2的答案是肯定的,那么如何回答?我对c#一窍不通,所以我不介意指点一下

  • 编辑:


    因此,出于纯粹的绝望,我在我的项目中调整了导入的函数签名-它是
    std::string(uu cdecl*TFunc)(),将其更改为
    BSTR(u cdecl*TFunc)()-它可以工作!尽管库手册和依赖项遍历工具都坚持std::string是正确的。这是一个编辑,而不是答案,因为我仍然不知道这里发生了什么,这是可怕的。

    典型的C++实现的经验法则是,它们倾向于向后兼容,而不是向前兼容。通常可以使用旧编译器的运行库从同一编译器更新版本运行由旧C++编译器编译的代码;但事实并非如此。这里C完全不相关,因为C不是C++。总是会有个别例外,这只是一个经验法则。如果示例项目在VS2010下工作,那么使用它没有问题,您一定在其他地方有错误。它看起来只是工作,实际上泄漏了std::string对象占用的内存。唯一正确的方法是使用C++/CLI项目。和VS2013。使用电话,请作者为您提供正确的构建或更友好的界面,以实际返回BSTR。虽然很有疑问,当他们给了你一个C样本项目时,你应该相信他们知道他们在做什么。经验法则与典型的C++实现是倾向于向后兼容,而不是向前兼容。通常可以使用旧编译器的运行库从同一编译器更新版本运行由旧C++编译器编译的代码;但事实并非如此。这里C完全不相关,因为C不是C++。总是会有个别例外,这只是一个经验法则。如果示例项目在VS2010下工作,那么使用它没有问题,您一定在其他地方有错误。它看起来只是工作,实际上泄漏了std::string对象占用的内存。唯一正确的方法是使用C++/CLI项目。和VS2013。使用电话,请作者为您提供正确的构建或更友好的界面,以实际返回BSTR。尽管当他们给你一个C#项目的样本时,你是否应该相信他们知道他们在做什么,这是相当值得怀疑的。