2015-08-27 56 views
2

我試圖修改2個.exes以從1個位置加載DevExpress dll。更改.NET應用程序的程序集解析位置

「產品」文件夾中的.exes與啓動程序使用相同的.dll。我想避免必須將相同的.dlls放入Products目錄,而是將.exes從1個目錄讀回(啓動器目錄)。

我該如何做到這一點?

enter image description here

enter image description here

回答

4

您可以處理AppDomain.AssemblyResolve事件,並從自己使用Assembly.LoadFile給FULLPATH它試圖解決的程序集的目錄加載的程序集。

實施例:

. 
. 
. 
// elsewhere at app startup time attach the handler to the AppDomain.AssemblyResolve event 
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 
. 
. 
. 

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    AssemblyName assemblyName = new AssemblyName(args.Name); 

    // this.ReadOnlyPaths is a List<string> of paths to search. 
    foreach (string path in this.ReadOnlyPaths) 
    { 
     // If specified assembly is located in the path, use it. 
     DirectoryInfo directoryInfo = new DirectoryInfo(path); 

     foreach (FileInfo fileInfo in directoryInfo.GetFiles()) 
     { 
      string fileNameWithoutExt = fileInfo.Name.Replace(fileInfo.Extension, "");      

      if (assemblyName.Name.ToUpperInvariant() == fileNameWithoutExt.ToUpperInvariant()) 
      { 
        return Assembly.Load(AssemblyName.GetAssemblyName(fileInfo.FullName)); 
      } 
     } 
    } 
    return null; 
} 
+0

這是我的Program.cs文件:pastebin.com/Qkr08HCv如果我把所有他的DevExpress的文件到文件夾DevExpress的和它以外運行Form1上,它不除非我將dll放回與表單相同的位置,否則打開。我在Main()的最頂端放置了一個MessageBox(「Test」),當.dlls與exe不在同一個文件夾時它不會觸發,所以我無法調用AppDomain.CurrentDomain.AssemblyResolve + = CurrentDomain_AssemblyResolve;從那裏 – Kyle

+0

這取決於它何時試圖加載這些類型。您必須能夠在必須解決DevExpress類型之前註冊事件處理程序。 – Jim

+0

它看起來像是因爲您直接在您的Main方法中引用DevExpress類型,所以它必須在AssemblyResolve處理程序註冊之前加載這些類型 – Jim

1

你可以設置在assemblyBinding文件夾(或多個)路徑>探測::在的app.config爲公共語言運行庫privatePath標籤加載程序集時進行搜索。 這樣的代碼

Reference MSDN

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="libs" /> 
    </assemblyBinding> 
</runtime> 
</configuration>