log4net依赖问题

14

我有一个使用log4net的问题一直困扰着我,现在决定解决它。

我有一个类库引用了log4net。如果我在另一个项目中引用了这个类库,则必须在该项目中引用log4net,否则会出现构建错误。

Unknown build error, 'Cannot resolve dependency to assembly 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' because it has not been preloaded. When using the ReflectionOnly APIs, dependent assemblies must be pre-loaded or loaded on demand through the ReflectionOnlyAssemblyResolve event.' 

我知道错误信息可能已经告诉了我解决方案,但不幸的是我不懂这些胡言乱语...

谢谢大家

Alex..

4个回答

10

以下是描述正在发生的情况以及如何修复它的链接:

https://learn.microsoft.com/en-us/archive/blogs/jmstall/viewing-types-with-reflection-only

上述链接中的摘录:

所以发生的情况是它尝试获取 Bar 的 System.Type,但要解析该类型,它需要加载位于另一个 dll 中的基类。Reflection-Only 上下文不执行绑定策略,因此无法找到该 dll。LoaderException 提示使用 ReflectionOnlyAssemblyResolve,它提供更多有关此问题的信息。

为了使用反射 API,您必须解析所有使用的依赖项。


不,因为这个错误是在我将我的类库添加到一个空项目中之后出现的,甚至在我对类库进行任何调用之前就已经出现了。 - Fergal Moran
@Alex DeLarge 我已经链接到了一个解释正在发生什么的 MSDN 文章。 - kemiller2002
1
谢谢你的回答,Kevin。我会接受这个答案,但是我更想知道如何使用log4net来解决这个问题。 - Fergal Moran
我也遇到了log4net的这个问题...不知道是不是VS2010->VS2008的问题,因为团队中有些人已经在使用2010了。 - Luke
博客链接已更改为https://learn.microsoft.com/en-us/archive/blogs/jmstall/viewing-types-with-reflection-only。 - stusherwin

5
我知道已经过了一段时间,但我想分享一下解决方法。
看起来这个问题的主要原因是log4net在类库的程序集信息中需要它的配置文件。WPF似乎不喜欢那样做。在WPF应用程序本身中引用log4net会导致我的log4net配置文件被覆盖,因为WPF应用程序在构建顺序中后于类库,并生成一个默认的log4net配置文件。
因此,为了修复您的类库以便与程序集预加载一起使用,请按以下方式进行编辑:
在类库中删除AssemblyInfo.cs中的这一行:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

在你的库的入口点设置日志记录器,像这样:
FileInfo configFileInfo = new FileInfo("log4net.config");
log4net.Config.XmlConfigurator.ConfigureAndWatch(configFileInfo);

如果您在app.config文件中设置了log4net,只需引用那个文件即可。
我在这里找到了这个解决方案。

4

当我创建一个新的WPF项目并添加一个引用到另一个引用了log4net的项目时,我遇到了与log4net相同的问题。我通过使用这些说明将log4net.dll添加到GAC解决了这个问题:http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx


1
是的,那样做可以,但不幸的是将程序集添加到全局程序集缓存(GAC)并非总是可行的。 - Fergal Moran
我在使用log4net和WPF项目时遇到了完全相同的问题。log4Net被引用在一个单独的项目中,即类库,然后我想引用该类库到我的WPF项目中。我使用了包管理器控制台,在WPF项目中安装了log4net(Install-Package log4net -project My.Wpf.Project),这解决了问题。 - David Barrows

1

我曾经遇到过同样的问题。虽然我还没有完全理解它,但我可以告诉你我是如何解决这个问题的。 我有一个单元测试项目B,其中引用了项目A,并且项目A引用了log4net。对我来说,这些无意义的东西意味着当Visual Studio尝试为单元测试项目创建.accessor文件时,它会反映项目A。这意味着它尝试加载项目A的引用,但是装配件加载器找不到它,因为我没有将log4net放在GAC中,只是让项目A本地引用。在我的情况下,将log4net添加到我的DEVPATH(GAC也可以)就是解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接