0

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

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

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

感谢您提供的任何见解

艾伦

4

1 回答 1

0

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

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

所以,我们需要注意目录:

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

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

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

因此,为了使事情顺利进行,我必须:

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