2012-04-27 136 views
10

我有一個C#應用程序,並組織它的文件我有一個名爲「數據」的文件夾中的一些DLL。我想讓EXE檢查這個文件夾的DLL,就像它檢查它的當前目錄一樣。如果我使用以下信息創建了一個App.Config:C#設置不帶app.config的探測privatePath?

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="Data" /> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

它可以毫無問題地工作。我不想有一個App.Config。有沒有辦法設置探測路徑而不使用app.config?

回答

4

您可以爲您創建的新AppDomain執行此操作,但我不相信在當前/默認AppDomain的託管代碼中有辦法執行此操作。

編輯:創建私人路徑的AppDomain:使用AppDomain.CreateDomainAppDomainSetup .PrivateBinPath

+0

+1。沒辦法 - 創建AppDomain時必須設置它。 app.config由程序從運行時開始計算。只有替代方法是在代碼中創建第二個應用程序域。這雖然可能是一個適合的方法。 – TomTom 2012-04-27 05:45:43

+0

我該怎麼做? – 2012-04-27 11:31:59

+0

用鏈接更新了答案。 – 2012-04-27 15:51:29

0

setup.ApplicationBase = DATADIR; тожесамое,чтоиprivatePath = 「數據」

[STAThread] 
    static void Main() 
    { 
     #region Add Dll Folder 

     System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(MainForm)); 
     string dataDir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(new Uri(assembly.GetName().CodeBase).LocalPath), "Data"); 

     AppDomainSetup setup = new AppDomainSetup(); 
     setup.ApplicationBase = dataDir; 

     #endregion Add Dll Folder 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
3

這是一個老問題,但你也可以處理的AppDomain AssemblyResolve事件,像這樣:

```

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

` ``

和:

```

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var probingPath = pathToYourDataFolderHere; 
     var assyName = new AssemblyName(args.Name); 

     var newPath = Path.Combine(probingPath, assyName.Name); 
     if (!newPath.EndsWith(".dll")) 
     { 
      newPath = newPath + ".dll"; 
     } 
     if (File.Exists(newPath)) 
     { 
      var assy = Assembly.LoadFile(newPath); 
      return assy; 
     } 
     return null; 
    } 

```