我在写日志库。默认情况下,我希望库写入为应用程序命名的公共应用程序数据文件夹中的目录。例如,如果应用程序名为"MyApplication.exe",我希望将数据保存在"C:\ProgramData\MyApplication“中。
我使用这段代码来构造路径:
private static string loggingDataPath =
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) +
Path.DirectorySeparatorChar +
Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().CodeBase) +
Path.DirectorySeparatorChar;这与预期完全相同,但有一个问题。我不能对图书馆进行单元测试!
当我试图运行单元测试时,它们都会在System.NullReferenceException中失败。如果我用字符串替换"Assembly.GetEntryAssembly().CodeBase“调用,那么单元测试将再次正常运行。
我想我理解为什么会发生这种情况,但我不知道如何解决这个问题。我希望有人能让我走上正义之路。
蒂娅!
更新(5-24-12):我没有尝试单元测试"loggingDataPath“的内容。仅存在"Assembly.GetEntryAssembly().CodeBase“调用就会导致除上述异常之外的所有单元测试失败。注意,"loggingDataPath“是静态的(因为它必须是静态库)。
发布于 2012-05-28 19:25:58
忽略以前答案中的圣人建议,只回答我的问题,下面是我如何解决这个问题的方法:
public static string LoggingDataPath {
get {
return loggingDataPath.Length > 0 ? loggingDataPath :
Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) +
Path.DirectorySeparatorChar +
Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().CodeBase) +
Path.DirectorySeparatorChar;
}
set { loggingDataPath = value; }
} 此解决方案避免在第一次访问静态类时初始化“loggingDataPath”,从而避免了对‘Assembly.GetEntryAssembly()..CodeBase’的调用。
发布于 2012-05-24 13:50:41
不仅是单元测试会导致问题。
考虑到这个当从非托管应用程序加载托管程序集时,GetEntryAssembly()可以返回空和那个CodeBase可以包含从因特网下载的程序集的URL,并且不为从GAC加载的程序集设置,我将避免在通用日志库中尝试这种方法。
如果这还不足以说服您,其他问题是:(a)非特权用户将无法对CommonApplicationData进行写入访问;(b)尝试写入同一个日志文件的应用程序的多个实例将是一个问题。
相反,我将定义日志文件在配置中的位置。
为了避免这个问题,你建议我把它放在哪里?
正如我所说的,我将在配置中定义它(例如,appSetting中的app.config)。这是最灵活的。如果要将其置于CommonApplicationData下,可以使用环境变量,在读取配置文件时使用Environment.ExpandEnvironmentVariables方法展开该环境变量。例如:
<appSettings>
<add key="logFile" value="%ALLUSERSPROFILE%\MyApp\MyLogFile.log" />
...
</appSettings>您仍然必须解决向非特权用户提供访问权的问题,并在从多个实例访问时避免争用。您说底层日志库支持并发访问,但是要注意,根据日志记录的详细程度,这将带来潜在的性能成本。
https://stackoverflow.com/questions/10729676
复制相似问题