2017-01-15 6 views
1

私はカスタム拡張を書くことによってカスタマイズできるアプリケーションを持っています。それらはすべてproj\Extensionsフォルダにあります。実行時に私のCoreプロジェクトは、フォルダからすべての拡張子を読み込み、コードを実行します。問題は、Coreプロジェクトがこれらの追加ライブラリへの参照を見つけることができないため、拡張機能の1つが追加ライブラリを使用する場合です。ロードされたdllへの参照を見つける

だから例えば私が持っている私のCoreプロジェクトに:私の拡張機能の一つで

public void Preview(IFileDescription fileDescription) 
{ 
    var extension = Path.GetExtension(fileDescription.FilePath); 
    var reader = _readerFactory.Get(extension); 
    Data = reader.GetPreview(fileDescription); 
} 

私は唯一のインタフェースについて

public DataTable GetPreview(IFileDescription options) 
{ 
    var data = new DataTable(); 
    using (var stream = new StreamReader(options.FilePath)) 
    { 
     var reader = new CsvReader(stream); // <- This is from external library and because of this Core throws IO exception 
    } 
    /* 
    ... 
    */ 
    return data; 
} 

Coreを知っているので、読者の1は、例えば使用する場合CsvHelper.dllFileNotFoundの例外があります。CoreCsvHelper.dllが見つからないためです。特定のフォルダに追加のライブラリを探すようコンパイラーに指示する方法はありますか? Reference Pathsを使用しましたが、問題は解決しませんでした。それでも同じ例外が投げられました。

答えて

1

はい、可能です。 AppDomain.AssemblyResolveイベントにアタッチし、アドインディレクトリから必要なDLLを手動でロードできます。アドインコードを実行する前に、次のコードを実行してください。

var addinFolder = ...; 

AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => 
{ 
    var missing = new AssemblyName(e.Name); 
    var missingPath = Path.Combine(addinFolder, missing.Name + ".dll"); 

    // If we find the DLL in the add-in folder, load and return it. 
    if (File.Exists(missingPath)) 
     return Assembly.LoadFrom(missingPath); 

    // nothing found, let .NET search the common folders 
    return null; 
}; 
+0

ありがとうございました。私は7分でこの答えを受け入れるでしょう:) – FCin

関連する問題