2017-11-15 15 views
0

私はラズベリーパイのC#を使いこなし始めました。うまくいくようです。私は、Monodevelopを使ってArch LinuxマシンにC#アプリケーションを開発しています。bin/Debug /ディレクトリのすべてを自分のRaspberry Piにscpしてから、 "mono my.exe"を実行しています。これは私が試したいくつかの簡単なアプリケーションで動作しましたが、NLogに問題があります。実行ファイルは、私の開発マシン上で正常に動作が、私はラズベリーパイの上に、この例外を取得:C#Mono NLogファイルまたはアセンブリをロードできませんでした。ラズベリーPIにデプロイされたとき

mono NLogTest.exe 

Unhandled Exception: 
System.TypeInitializationException: The type initializer for 'NLogTest.MainClass' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly or one of its dependencies. 
    at NLog.LogFactory.get_Configuration() [0x000aa] in <eb9f75c9ffa040549f1fea1320a5bf6c>:0 
    at NLog.LogFactory.GetLogger (NLog.LogFactory+LoggerCacheKey cacheKey) [0x0012c] in <eb9f75c9ffa040549f1fea1320a5bf6c>:0 
    at NLog.LogFactory.GetLogger (System.String name) [0x00011] in <eb9f75c9ffa040549f1fea1320a5bf6c>:0 
    at NLog.LogManager.GetCurrentClassLogger() [0x0000a] in <eb9f75c9ffa040549f1fea1320a5bf6c>:0 
    at NLogTest.MainClass..cctor() [0x00000] in <689b8644ac61434f9d79427c3bf696a7>:0 
    --- End of inner exception stack trace --- 

NLogは、設定ファイルを見つけることができないかのように思えるが、それは同じディレクトリにあります。

私が使用しています簡単な例は次のとおりです。

using System; 
using NLog; 
namespace NLogTest 
{ 
    class MainClass 
    { 
     private static Logger logger = LogManager.GetCurrentClassLogger(); 
     public static void Main(string[] args) 
     { 
      Console.WriteLine("Testing NLog"); 
      logger.Trace("A Trace!!"); 
      logger.Debug("Sample debug message"); 
      logger.Info("Sample informational message"); 
      logger.Warn("Sample warning message"); 
      logger.Error("Sample error message"); 
      logger.Fatal("Sample fatal error message"); 
      Console.Write("DONE LOGGING!"); 
     } 
    } 
} 

と私のNLog.configファイルは非常に単純です:

<?xml version="1.0" encoding="UTF-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     autoReload="true" 
     throwExceptions="false"> 
    <targets> 
     <target xsi:type="File" 
      name="logFile"    
      fileName="The.log" 
      /> 
    </targets> 
    <rules> 
     <logger name="*" writeTo="logFile" minlevel="Info" /> 
    </rules> 
</nlog> 

私のラズベリーパイexeファイルが含まれている、NLog.config上のディレクトリファイル、およびNLog.dll。

aptからmono-runtimeパッケージをRaspberry piにインストールしました。私の開発マシンでは、プロジェクトのMonodevelopビルドオプションが "Mono/.NET 4.5"をターゲットに設定されています。モノラルランタイムがアーキテクチャの違いを処理すると思っていたため、x86マシンで開発してARM-Aマシンにデプロイすることは重要ではないと私は考えました。

ここにお手伝いいただきありがとうございます。

+0

NLogのどのバージョンを使用していますか?設定ファイルが見つからないため例外がスローされるというのは不思議です。 –

+0

Mono用に手動でNLog.dllをコンパイルしましたか?そうでない場合は、Net35用のNLog.dllを使用するようにしてください。 –

+0

@RolfKristensen NuGet経由でNLogをダウンロードしたところ、4.4.12です。それはnet45のようだ。 Mono用にコンパイルされているかどうかわかりませんが、おそらくそれを試してみます。ヒントをありがとう! – Jesse

答えて

0

NLogは大文字と小文字を区別しないファイル名を持つWindowsの世界で生まれたと考えています。 Linuxでは大文字と小文字が区別さ

あなたは(右のケースで)手動nlog.configへのパスを指定する必要があります。

LogManager.Configuration = new XmlLoggingConfiguration("path/nlog.config"); 

が手動で設定をロードしたまでLogManager.GetCurrentClassLogger()への呼び出しを遅らせることがあります。

0

@Rolf Kristensenのおかげで、私はLogManager.GetCurrentClassLoggerコールをmainに移動しました。ファイルまたはアセンブリまたは その依存関係の1つをロードできませんでしたが原因0x0a00001f:/home/pi/monotest/NLog.dll mtoken:それから私は、メッセージ

は、カスタムのattrコンストラクタイメージを見つけることができませんです。アセンブリ:System.Core、バージョン= 4.0.0.0、 ニュートラル文化=、なPublicKeyToken = b77a5c561934e089タイプ: メンバー:

これは、このgithubの問題に私を導いた:私は上にlibmono-system-servicemodel4.0a-cilをインストールした場合https://github.com/NLog/NLog/issues/905

apt-getとターゲットラズベリーパイは、それは動作します!

これは、ターゲットフレームワークが.NET 4.5で、ターゲットアーキテクチャが「すべて」であることもあります。

関連する問題