我有一个相当古老的非托管C ++程序,它调用了我需要转换的托管c#代码(vs2003)。 (最初的c#代码是用.NET1.1编写的,需要重新编译,它被编译成4.0)虽然最终我需要重写整个东西,但我希望得到原始代码运行一点更长的时间。
我已经解决了我在这个测试用例中看到的问题:
使用VS2010我创建了一个新项目:“Visual C ++ | MFC应用程序”
使用向导,我创建了一个基于对话框的应用程序,其中包含所有默认设置。 在app类中包含以下标题后
#include <fstream>
在新App类的InitInstance中我创建了一个包含以下两行代码的文件:
ofstream xmlstream;
xmlstream.open("junk.txt");
当app运行时,对话框会在Debug和Release模式下创建一个新文件
但是,当我尝试通过将项目属性| general | common runtime Support标志更改为Common Runtime支持来启用c#代码时,旧语法(/clr:oldSyntax
)出现以下错误。
在调试模式下,程序运行正常,并创建一个文件。
在释放模式下,程序崩溃执行行
ofstream xmlstream;
错误:
An unhandled exception of type 'System.AccessViolationException' occurred in Unknown Module.
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
对此类程序问题的唯一其他参考建议将“C / C ++ |代码生成|启用C ++异常”的属性设置为/EHa
。
我确实检查了fstream.h而不是fstream的参考(旧样式标题在2010年不再存在,他们在2003年确实存在)但是我使用的是新的标题。除非现在声明流对象的语法有问题,否则我不确定是什么问题。
我是否需要设置另一个开关以使其正确编译,或者我本能做一些没有意义的事情?
答案 0 :(得分:0)
如果我没有错,VS继续发售“遗留”iostreams库(Dinkumware的预标准版本)。 (reference)我不确定VS2003是否仍然包含它,但了解微软,我不会感到惊讶。
它可能仍在使用中,与新的C ++标准库容器/ ABI不兼容。所以,我会检查标头和名称空间使用来查找
#include <iostream.h>
修复
#include <iostream>
上面的链接对如何将任何旧式iostreams代码迁移到新样式有一些非常好的指导,因此我将重复链接:http://members.gamedev.net/sicrane/articles/iostream.html
HTH