2017-08-10 34 views

回答

1

有很多方法可以做到這一點這種方法。有關運行時如何查找程序集的詳細說明,請參閱How runtime locates assemblies

可以在app.config通過codeBase元素指定精確的位置:

<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> 

如果您的組件在應用程序的子目錄下,那麼你可以使用probing元素:

<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'加載它並返回它。看看我鏈接到的類似SO問題的例子。 – nejcs

+0

我的問題是根dll必須位於應用程序路徑(C:\ Program Files \ RING)中,而其他位置必須位於不同的位置(C:\ Program Files \ ThirdParty)。這可以在沒有動態加載的情況下實現,並且即使在部署之後也必須引用第三方文件夾? – user7380740

1

我會嘗試使用Assembly.LoadFrom(string)。這個超載需要通往組件的路徑,並允許你通過反射來利用它。

你可以組裝這樣的:

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

然後調用使用MethodInfo.Invoke()

+0

謝謝你Nate。我們可以在沒有動態加載的情況下達到同樣的效果嗎 – user7380740

相關問題