首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Assembly.GetEntryAssembly().CodeBase排除了单元测试

Assembly.GetEntryAssembly().CodeBase排除了单元测试
EN

Stack Overflow用户
提问于 2012-05-24 00:28:25
回答 2查看 1.9K关注 0票数 0

可能重复: .NET NUnit test - Assembly.GetEntryAssembly()为空

我在写日志库。默认情况下,我希望库写入为应用程序命名的公共应用程序数据文件夹中的目录。例如,如果应用程序名为"MyApplication.exe",我希望将数据保存在"C:\ProgramData\MyApplication“中。

我使用这段代码来构造路径:

代码语言:javascript
复制
   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“是静态的(因为它必须是静态库)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-28 19:25:58

忽略以前答案中的圣人建议,只回答我的问题,下面是我如何解决这个问题的方法:

代码语言:javascript
复制
   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’的调用。

票数 0
EN

Stack Overflow用户

发布于 2012-05-24 13:50:41

不仅是单元测试会导致问题。

考虑到这个当从非托管应用程序加载托管程序集时,GetEntryAssembly()可以返回空和那个CodeBase可以包含从因特网下载的程序集的URL,并且不为从GAC加载的程序集设置,我将避免在通用日志库中尝试这种方法。

如果这还不足以说服您,其他问题是:(a)非特权用户将无法对CommonApplicationData进行写入访问;(b)尝试写入同一个日志文件的应用程序的多个实例将是一个问题。

相反,我将定义日志文件在配置中的位置。

为了避免这个问题,你建议我把它放在哪里?

正如我所说的,我将在配置中定义它(例如,appSetting中的app.config)。这是最灵活的。如果要将其置于CommonApplicationData下,可以使用环境变量,在读取配置文件时使用Environment.ExpandEnvironmentVariables方法展开该环境变量。例如:

代码语言:javascript
复制
<appSettings>
    <add key="logFile" value="%ALLUSERSPROFILE%\MyApp\MyLogFile.log" />
    ...
</appSettings>

您仍然必须解决向非特权用户提供访问权的问题,并在从多个实例访问时避免争用。您说底层日志库支持并发访问,但是要注意,根据日志记录的详细程度,这将带来潜在的性能成本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10729676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档