无法在 C# Windows 应用程序下写入 C++ dll 项目中的文件

Posted

技术标签:

【中文标题】无法在 C# Windows 应用程序下写入 C++ dll 项目中的文件【英文标题】:Unable to write to files in C++ dll project under C# Windows Application 【发布时间】:2014-04-02 09:42:12 【问题描述】:

我有一个 C++ dll 项目,它将由 C# Windows 应用程序调用。但是每次我尝试写入C++ dll项目中的文件时,我都会得到以下错误:

An unhandled exception of type 'System.AccessViolationException' occurred in Wrapper.dll

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

收到此错误时,代码指针指向文件fstream_Lock()

我在C++ dll项目中使用的代码是:

ofstream ofs("debug.txt");      // OK
if (ofs.good())                 // OK
    ofs << "aaa" << endl;       // this line causes the error  <--
ofs.close();

其他信息:

    在VS2010-Winx64(.NET Framework 4)下开发。 Wrapper 是托管 C++ 项目,它封装 C++ 代码以便在 C# 中调用。 我检查了debug.txt 文件,该文件是可写的。

非常感谢任何建议。谢谢。

【问题讨论】:

检查您是否确实有权写入运行应用程序的文件夹。从字面上看可能是 Windows 访问问题或文件是只读的? @miltonb 我更新了问题,谢谢。 您正在传递一个需要指针的值... @leppie 我不明白。我在哪里传递了一个值? 到目前为止,AV 最常见的原因是堆损坏。它绝不是由触发异常的代码引起的。不必调试这样的 Heisenbugs 当然是托管代码流行的一个重要原因:) 【参考方案1】:

原来我在设置运行时库时搞混了。将 C++ dll 项目的运行时库从 /MD 更改为 /MDb 解决了该问题。

在 VS2010 中,可以这样做:

Project -> Properties -> Configuration Properties -> C/C++ 
        -> Code Generation -> Runtime Library -> Multi-threaded Debug DLL (/MDd)

【讨论】:

以上是关于无法在 C# Windows 应用程序下写入 C++ dll 项目中的文件的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法创建将启动的 Windows 服务

从 C# windows 应用程序调用 C dll 会导致 svchost.exe 崩溃

Windows Worker 服务文件夹权限 (C#)

C# Windows 窗体无法在 Windows10 上加载非托管 C++ DLL

Windows 7 CreateProcess,子进程无法写入文件?

C# windows 服务在调试时安装,而不是在发布时安装