我正在为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不允许对本地文件系统进行写访问吗?
感谢您提供的任何见解
艾伦
答案 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的默认工作目录中的文件,如上所述,该文件不是可写入的位置。
所以,为了使事情有效,我必须: