0

我有一个从现有表格派生的表格。现有形式完美运行。当我尝试(第一次)打开新表单时,我收到设计师的错误:

为了防止在加载设计器之前可能丢失数据,必须解决以下错误:

拒绝访问路径“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Logs\eventlog.dat”。

这个文件甚至不存在。如果我查看调用堆栈,它会变得更加奇怪。在派生表单的构造函数中,有一个创建日志文件的类。

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
at MeterView.MVLogger..ctor() in C:\Users\glevenson\Documents\Visual Studio 2010\Projects\MeterView\MeterView\MVDataLogger.cs:line 67
at MeterView.MVLogger.get_Instance() in C:\Users\glevenson\Documents\Visual Studio 2010\Projects\MeterView\MeterView\MVDataLogger.cs:line 79
at MeterView.frmSingle..ctor() in C:\Users\glevenson\Documents\Visual Studio 2010\Projects\MeterView\MeterView\frmSingle.cs:line 167 

这是引用实际上创建目录和日志文件的行代码,但来自应用程序当前目录。这根本没有意义。

为什么会生成有关不存在文件的警告,为什么它会阻止我在设计器中执行任何操作?因为这个,我现在完全死在了水里。

感谢您的任何建议。

4

3 回答 3

2

你在这里犯了两个错误。第一个是您没有指定文件的完整路径名。您只需指定“eventlog.dat”即可创建/打开日志文件。当默认工作目录未设置在您希望的位置时,就会出错。在设计模式下,它肯定不会被设置在任何满意的地方。在您发布项目后,它永远不会正确设置,您无法写入 c:\program 文件的子目录。您必须使用 Environment.GetFolderPath() 来选择您可以写入的 AppData 路径。

第二个错误是您允许此代码在设计模式下运行。使用 DesignMode 属性来防止这种情况发生。

于 2012-09-27T15:18:22.580 回答
0

根据您那里的内容进行疯狂猜测,但了解 Visual Studio,以下是我的猜测(在评论中格式不正确,所以各位大神,请原谅我):

  1. MVDataLogger由于缺乏正确的初始化,类有问题
  2. MVDataLogger尝试加载/读取/写入名为“Logs\eventlog.dat”的文件
  3. MVDataLogger不确保文件/目录在打开之前存在。

我相信修复这些项目将解决您的问题。

于 2012-09-27T14:49:49.893 回答
0

错误是由构造函数中的代码生成的。尝试注释构造函数的所有自定义代码。如果一切正常,请取消注释行,直到您再次收到错误。尽量避免在构造函数中进行不安全的初始化。或使用:

if(!DesignerProperties.GetIsInDesignMode(this))
{
   // do something not dupported in designer 
}
于 2015-12-15T10:10:45.317 回答