2016-10-19 7 views
1

お客様にプラグインを導入しようとしています。 MEF、インポート、エクスポートの属性を使用します。私はエクスポートを使用し、クライアントはそれをインポートします 私のアプリケーションは、DevExpress XtraGrid、XtraEditors、および他の多くのDevExpress DLL(スクリーンショット参照)、System.Data.Servicesを使用します。 これらの必要なすべてのDLLとその依存関係の多くを提供して、プラグインはまだDevExpress.ExpressAppを必要としているようです。 DevExpress.ExpressAppと他のすべての依存関係は絶対に必要ありません。なぜこのDLL DevExpress.ExpressAppがロードされますか?

クライアントはFileNotFound例外があると不平を言っていたので、自分でプラグインをインポートするテストプロジェクトを作成することにしました。これは私が得ているクライアントの理論をテストするためのテストコードです。

System.IO.FileNotFoundException: Could not load file or assembly 'DevExpress.ExpressApp.v14.2, Version=14.2.7.0, 


Our Plugin 
    [Export(typeof (ISomething))] 
     public class MyClass : ISomething 
     { 

    } 
TESTER 
    class Program 
    { 
      [ImportMany] 
     public IEnumerable<ISomething> Somethings { get; set; } 
     static void Main(string[] args) 
     { 

      var rp = new Program(); 
      rp.Run(); 


     } 
     public void Run() 
     { 
      Compose(); 

     } 
     public void Compose() 
     { 
      try 
      { 
       AppDomain.CurrentDomain.FirstChanceException += FirstChanceHandler; 
       AggregateCatalog aggregatecatalogue = new AggregateCatalog(); 
       aggregatecatalogue.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
       CompositionContainer container = new CompositionContainer(aggregatecatalogue); 
       CompositionBatch batch = new CompositionBatch(); 
       batch.AddPart(this); 
       container.Compose(batch); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 

     static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e) 
     { 
      System.Text.StringBuilder msg = new System.Text.StringBuilder(); 
      msg.AppendLine(e.Exception.GetType().FullName); 
      msg.AppendLine(e.Exception.Message); 
      System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
      msg.AppendLine(st.ToString()); 
      msg.AppendLine(); 
      String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      string logFilePath = String.Format("{0}\\{1}", desktopPath, "logfile.txt"); 
      System.IO.File.AppendAllText(logFilePath, msg.ToString()); 

     } 

案の定、私は、出力ウィンドウに見て、それが実際にこのDLLとGACからExpressAppに関連する依存関係の一部をロードしていることが分かりました。 質問:ExpressAppが必要な場所と理由を把握するにはどうすればよいですか? 私は単純にDLLを提供するだけですが、必要なものが何であるかを手がかりにしているTONの依存関係について何度も繰り返します。

enter image description here

+0

あなたの問題を解決するのに幸運でしょうか? – andrews

答えて

1

マネージアセンブリの依存関係をチェックするためのツールがあります。 MS Windows SDKには、ildasm.exeユーティリティが含まれています。チャンスあなたはすでにそれがにインストールされているされている:私は同様の問題があった場合にはIldasm.exeを

\ \プログラムファイル(x86の)\マイクロソフトのSDK \ Windowsの\ v8.0A \ binに\ NETFX 4.0ツール:

C (これはdllバージョンの不一致でした)コマンドラインからcygwinの 'grep'を使用して、すべてのDXとカスタムアセンブリの不足している依存関係の文字列を検索して、実際の.dllファイルを探して、不足している依存関係のDLLバージョンを参照しました。その後、ildasm.exeで開き、MANIFESTツリーノードをダブルクリックします。そこに私が持っていなかった.dllバージョンへの参照を見た。

同じ手順を実行して、不足している依存関係を追跡することもできます。プロジェクトのbinディレクトリにあるすべてのDX dllに対して「DevExpress.ExpressApp」文字列検索を実行し、結果が見つかった場合はildasm.exeで報告ファイルを開きます

「grep」はほとんどありませんhttps://www.cygwin.com/パッケージがインストールされているので、利用可能な文字列検索ユーティリティを使用してください。

dllの依存関係をチェックするための他のサードパーティのツールもありますが、ildasm.exeはWindows SDKの一部ですが、これらは別途インストールする必要があります。他のツール、参考文献のため、この質問の答えを参照してください:

How do I determine the dependencies of a .NET application?

UPDATE:

あなたのアプリはプラグインで、DXのLIBSを使用していますので、あなたがbinフォルダ内のすべてのあなたのDXのLIBSを持っていない場合直接GACから、あなたは私の場合には、右DXのインストールフォルダにDevExpress.ExpressApp参照を検索することができる:

C:\プログラムファイル(x86の)DevExpress社15.2 \コンポーネント\ビン\ Frameworkの

\

上記のフォルダの内容を一時フォルダにコピーし、すべてのロケールサブフォルダとすべてのDevExpress.ExpressAppを削除しました。その後、* DLLとコマンドを実行しました:

次のような結果を生み出し
grep -nr "DevExpress.ExpressApp" 

:上記のDLLのいずれかがあなたのプラグインやプラグインがにあるホストアプリのいずれかで使用されている場合

Binary file DevExpress.EasyTest.v15.2.dll matches 
Binary file DevExpress.Persistent.Base.v15.2.dll matches 
Binary file DevExpress.Persistent.BaseImpl.EF.v15.2.dll matches 
Binary file DevExpress.Persistent.BaseImpl.v15.2.dll matches 
Binary file DevExpress.Workflow.Activities.v15.2.Design.dll matches 
Binary file DevExpress.Workflow.Activities.v15.2.dll matches 

を参照してください。配備される。

HTH

+0

こんにちは、私は運がなかった。ヒントありがとうございます。私は本当に感謝しています。オハイオ州..これはトーチャーです。あなたのヒントを本当にありがとう。 – user575219

+0

私はgrepを使用して文字列を検索するというアイデアが好きです。これは欠けているDLLです。あなたが正しいです。私はExpressAppがPeristent.BaseImplによって使用されていることを何らかの形で理解しました。しかしその後、私はサイクルを理解するために続けました。なぜ私がBaseImplが必要なのかを覚えていない。とにかくありがとう! – user575219

+0

BaseImplは、プラグイン/アプリではなく、参照リストから別のDX libで直接リクエストすることができます。私の答えを受け入れて投票してくれてありがとう! – andrews

関連する問題