对Visual Studio加载项内的本地文件系统的写访问权

时间:2013-08-07 20:17:19

标签: nlog visual-studio-addins

我正在为Visual Studio 2012开发一个加载项(在C#中),我正在尝试使用NLog将加载项代码中的信息记录到本地日志文件中(例如,在添加的同一本地目录中) In正在加载)。没有记录任何内容,然后当我调试更多内容时,我似乎没有从外接程序代码内部对本地文件系统进行写访问。只是尝试打开一个本地文件并向其写一行会抛出一个System.UnauthorizedAccessException:

[System.UnauthorizedAccessException] = {"Access to the path 'C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\IDE\\test.txt' is denied."}

这只是加载项的基本限制吗? VS不允许对本地文件系统进行写访问吗?

感谢您提供的任何见解

艾伦

1 个答案:

答案 0 :(得分:0)

在挖掘NLog源代码后,我终于弄清楚这里发生了什么。

真正的问题是我将NLog.config文件放在错误的位置,因此NLog没有找到它。我用.AddIn文件和二进制文件将它放在Add-In目录中。而不是抛出某种异常NLog只是默默地禁用日志记录。事后看来,这是完全合理的行为,因为如果配置文件不存在,那么仅仅禁用日志记录是合法的。无论如何,没有日志写入,我的第一个想法是它可能是一个权限问题。然后我尝试创建一个文件(test.log)并在我的加载项代码中写入它,然后看到上面的异常,这加强了我(错误的)怀疑有一些安全模型阻止加载项写入文件系统。

因此,我们需要注意目录:

  • 加载项目录:这是.AddIn文件和相关二进制文件所在的位置。这是Visual Studio将查找加载项并从中加载它们的位置。

  • Visual Studio的默认目录:请记住,它是拥有该进程的devenv.exe,而不是加载项。因此,默认目录将是devenv.exe所在的位置,而不是加载项所在的位置。另请注意,此目录对非Admin用户具有写保护。这是NLog将查找NLog.config文件的地方!

  • NLog.config文件中日志文件目标的路径:这需要是一个可写的位置。只是在目标中指定一个文件(例如test.log)将表示Visual Studio的默认工作目录中的文件,如上所述,该文件不是可写入的位置。

所以,为了使事情有效,我必须:

  • 将NLog.config文件放在C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Common7 \ IDE中。我需要以管理员身份执行此操作。
  • 在NLog.config
  • 中指定日志文件的完整(可写)路径