clr:oldSyntax阻止ofstream

时间:2011-05-17 20:09:17

标签: c# c++ visual-studio-2010

我有一个相当古老的非托管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年确实存在)但是我使用的是新的标题。除非现在声明流对象的语法有问题,否则我不确定是什么问题。

我是否需要设置另一个开关以使其正确编译,或者我本能做一些没有意义的事情?

1 个答案:

答案 0 :(得分:0)

如果我没有错,VS继续发售“遗留”iostreams库(Dinkumware的预标准版本)。 (reference)我不确定VS2003是否仍然包含它,但了解微软,我不会感到惊讶。

它可能仍在使用中,与新的C ++标准库容器/ ABI不兼容。所以,我会检查标头和名称空间使用来查找

#include <iostream.h>

修复

#include <iostream>

上面的链接对如何将任何旧式iostreams代码迁移到新样式有一些非常好的指导,因此我将重复链接:http://members.gamedev.net/sicrane/articles/iostream.html

HTH