2017-08-10 31 views
1

アプリケーションのフォルダ外でdllを参照し、そのメソッドとインターフェイスを動的に読み込む方法は?それを行う方法はありますか?展開後も別のフォルダからdllを参照する

:アプリケーションの配備後でも、そのパスからの参照が必要です。

答えて

1

それを行うには多くの方法がありますを使用してそのメソッドを呼び出します。実行時アセンブリの検索方法の詳細は、How runtime locates assembliesを参照してください。

あなたはapp.configcodeBase要素を介して正確な位置を指定することができますあなたのアセンブリは、アプリケーションのサブフォルダにある場合は、あなたがprobing要素を使用することができます

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="myAssembly" 
           publicKeyToken="32ab4ba45e0a69a1" 
           culture="neutral" /> 
      <codeBase version="2.0.0.0" 
         href="http://www.litwareinc.com/myAssembly.dll"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

:それが失敗したすべての場合は、

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

をイベントハンドラを書き込んで、AppDomain.AssemblyResolveにアタッチしてアセンブリを明示的に読み込むことができます。 SOにも例があります。

+0

どうすればそれはアプリケーション自体とは別の別のフォルダにあり、そのDLLのバージョンが頻繁に変更されますか? – user7380740

+0

その後、 'AppDomain.AssemblyResolve'ルートを使用しなければなりません。アプリケーションのエントリポイントのどこかに、ローダが通常のメカニズムでアセンブリをロードできなかったときに呼び出されるレジスタハンドラ。ハンドラの中でアセンブリを見つけ、 'Assembly.LoadFrom'でロードして返します。私がリンクしているので、同様の質問からの例を見てください。 – nejcs

+0

私の問題は、ルートdllはアプリケーションパス(C:\ Program Files \ RING)になければならず、他のものは別の場所(C:\ Program Files \ ThirdParty)になければならないということです。ダイナミックローディングなしでこれを実現できます。デプロイ後もthirdpartyフォルダに参照する必要がありますか? – user7380740

1

Assembly.LoadFrom(string)を試してみます。この過負荷はアセンブリへのパスを引き出し、リフレクションでそれを利用できるようにします。

あなたはこのようにアセンブリを取得することができます:

var sampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll"); 
var method = sampleAssembly.GetTypes()[0].GetMethod("Method1"); 

その後MethodInfo.Invoke()

+0

ありがとうございました。ダイナミックローディングなしで同じことを達成できますか? – user7380740

関連する問題