【发布时间】:2018-04-24 07:38:21
【问题描述】:
我被要求在 Ubuntu Linux (14.04) 上编写一个小型仪器校准应用程序,并且一直在编写一些小型概念验证应用程序(串行 i/o、GUI、SQLite 等)以查看是否单声道是一个很好的选择。事情进展顺利,直到我测试了我最喜欢的日志记录包 log4net。我无法让代码工作。这是一个在 Windows 机器上运行良好的简单测试应用:
using System;
using log4net;
using log4net.Config;
public class L
{
public static void Main(string[] args)
{
Console.WriteLine("Version: " + Environment.Version);
XmlConfigurator.Configure(
new System.IO.FileInfo("console.logconfig.xml"));
Console.WriteLine("logging configured.");
ILog log = LogManager.GetLogger("root");
log.Info("This is an info message.");
log.Warn("This is a warning message.");
log.Error("This is an error message.");
}
}
编译
gmcs -pkg:log4net,dotnet -main:L -out:L.exe L.cs
代码编译,但产生运行时错误:
Version: 2.0.50727.1433
Missing method System.Reflection.Assembly::op_Equality(Assembly,Assembly) in assembly /usr/lib/mono/2.0/mscorlib.dll, referenced in assembly /usr/lib/mono/gac/log4net/1.2.10.0__a5715cc6d5c3540b/log4net.dll
Unhandled Exception:
System.MissingMethodException: Method not found: 'System.Reflection.Assembly.op_Equality'.
at log4net.LogManager.GetRepository (System.Reflection.Assembly repositoryAssembly) [0x00000] in <filename unknown>:0
at log4net.Config.XmlConfigurator.Configure (System.IO.FileInfo configFile) [0x00000] in <filename unknown>:0
at L.Main (System.String[] args) [0x00000] in <filename unknown>:0
这看起来像是 .Net 版本不匹配(也许 op_equality 在 .Net 2.0 中不可用?)。当我尝试强制使用 SDK 4 或 4.5 版本时:
gmcs -sdk:4.5 -pkg:log4n35,dotnet -main:L -out:L.exe L.cs
我得到一个编译错误:
error CS0006: Metadata file `cscompmgd.dll' could not be found
这是在一个全新的 Ubuntu 14.04 VM 上,通过以下方式安装了 Mono:
sudo apt-get install mono-complete
sudo apt-get install liblog4net1.2-cil
sudo apt-get install liblog4net-cil-dev
请推荐?
【问题讨论】:
-
1.2.10 真的很老,并且已知在 .NET 4.x 上存在问题。您是否尝试过更新的版本? logging.apache.org/log4net/download_log4net.cgi
-
@Stefan,就是这样——更新的版本修复了所有问题。 (叹气)我认为我不需要将 log4net 从 Apache 站点中删除,因为我认为 Ubuntu 存储库将包含当前版本。傻我。感谢您的帮助!