2012-04-27 40 views
10

Tôi có một ứng dụng C#, và để sắp xếp các tệp của nó, tôi có một số tệp DLL trong một thư mục có tên là "Dữ liệu". Tôi muốn EXE để kiểm tra thư mục này cho DLL của giống như cách nó kiểm tra thư mục hiện tại của nó. Nếu tôi đã tạo một App.Config với thông tin này:C# Đặt thăm dò privatePath mà không có 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> 

Nó hoạt động không có vấn đề gì. Tôi không muốn có một App.Config. Có cách nào để thiết lập đường dẫn thăm dò mà không cần sử dụng app.config không?

Trả lời

4

Bạn có thể làm điều đó cho các miền AppDomain mới mà bạn tạo, tôi không tin rằng có một cách để làm điều đó trong mã được quản lý cho AppDomain hiện tại/mặc định.

Edit: Tạo AppDomain với con đường riêng: sử dụng AppDomain.CreateDomainAppDomainSetup .PrivateBinPath

+0

+1. Không có cách nào - phải được đặt khi AppDomain được tạo. app.config được đánh giá theo chương trình bắt đầu từ thời gian chạy. Chỉ có thay thế là trong mã, tạo ra một appdomain thứ hai. Rằng mặc dù có thể là một cách tiếp cận suable. – TomTom

+0

Và tôi sẽ làm như thế nào? –

+0

Cập nhật câu trả lời bằng liên kết. –

0

setup.ApplicationBase = datadir; тоже самое, что и privatePath = "Dữ liệu"

[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

Đây là một câu hỏi cũ, nhưng bạn cũng có thể xử lý các AppDomain AssemblyResolve sự kiện như vậy:

`` `

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

' ``

và:

`` `

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

`` `

Các vấn đề liên quan