2012-04-27 21 views
10

Mam aplikację C# i do porządkowania jej plików Mam niektóre biblioteki DLL w folderze o nazwie "Dane". Chcę, aby EXE sprawdził ten folder dla bibliotek DLL, tak jak sprawdza bieżący katalog. Jeśli utworzyłem App.Config z tymi informacjami:C# Zestaw sondowania privatePath bez app.config?

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

Działa bez problemu. Nie chcę mieć App.Config. Czy istnieje sposób ustawienia ścieżki próbkowania bez użycia pliku app.config?

Odpowiedz

4

Możesz to zrobić dla nowych utworzonych AppDomains, nie wierzę, że istnieje sposób, aby to zrobić w zarządzanym kodzie dla bieżącego/domyślnego AppDomain.

Edit: Tworzenie AppDomain z własną ścieżką: użyj AppDomain.CreateDomain i AppDomainSetup .PrivateBinPath

+0

+1. Nie ma mowy - musi to być ustawione, gdy tworzona jest AppDomain. app.config jest oceniany przez program start z poziomu środowiska wykonawczego. Tylko alternatywa jest w kodzie, tworząc drugie appdomain. TO jednak może być odpowiednie podejście. – TomTom

+0

A jak miałbym to zrobić? –

+0

Zaktualizowano odpowiedź za pomocą linków. –

0

setup.ApplicationBase = datadir; тоже самое, что и privatePath = "Dane"

[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

To stara sprawa, ale można również obsługiwać AppDomain AssemblyResolve wydarzenie tak:

`` `

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

` ``

oraz:

`` `

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

`` `