std :: string是否可以通过不同版本的Visual Studio构建的DLL之间的DLL边界值传递?
答案 0 :(得分:4)
不,因为模板化代码是按模块单独生成的。
因此,当您的EXE实例化std::string
并将其传递给DLL时,DLL将开始使用完全不同的实现。结果是完全混乱,但它通常排序几乎起作用,因为实现非常相似,或者很难检测到混乱,因为它是某种微妙的堆损坏。
即使它们都使用相同版本的VS构建,但它非常不稳定/脆弱,我不推荐它。使用模块之间的C风格接口(例如,COM),或者只是不使用DLL。
此处有更详细的解释:Creating c++ DLL without static methods
在这里:How can I call a function of a C++ DLL that accepts a parameter of type stringstream from C#?
答案 1 :(得分:0)
通常,您不能混合使用不同编译器构建的二进制代码,其中包括同一编译器的不同版本(甚至可以包含使用不同命令行选项调用的相同编译器),因此您要尝试执行的操作的答案是一个明确的" No"。
原因是不同的编译器可能提供std :: string的不同实现。例如,一个实现可以具有固定的静态缓冲区,而另一个版本没有,这已经导致不同的对象大小。还有许多其他东西可以使接口不兼容,比如底层分配器,内部表示。由于名称损坏或不同的私有API,某些内容已经无法链接,这两者都可以保护您不会出错。
一些注意事项: