2009-12-08 27 views
5

Tôi gặp sự cố khi làm việc với Microsoft.Build.BuildEngine để sửa đổi tệp .exe.config cố định của tôi để thêm phần sau.Lập trình sửa đổi Ràng buộc lắp ráp

<?xml version ="1.0"?> 
<configuration> 
     <runtime> 
      <assemblyBinding xmlns="urnchemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
       <assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Vấn đề của tôi là, tôi không thể sửa đổi tệp, tôi phải khắc phục bằng mã và tôi nghĩ điều đó có thể thực hiện được, đúng không?

Nhưng làm cách nào ?, làm cách nào tôi có thể sửa đổi ứng dụng của mình để ứng dụng chạy như thể các thay đổi ở trên đã được thực hiện trên tệp cấu hình?

+0

cảm ơn David ... hãy cho biết những gì bạn đã làm để sửa định dạng đúng của xml – sebagomez

+0

Để định dạng một khối mã, bạn cần một dòng trống trước nó, và sau đó ít nhất bốn dấu cách ở đầu mỗi dòng mã. –

Trả lời

10

Tôi chỉ đang vật lộn với một vấn đề tương tự. Điều quan trọng là sử dụng sự kiện AppDomain.AssemblyResolve. Đây là những gì mã của tôi trông giống như:

public void LoadStuff(string assemblyFile) 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += 
      new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
     var assembly = Assembly.LoadFrom(assemblyFile); 

     // Now load a bunch of types from the assembly... 
    } 

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var name = new AssemblyName(args.Name); 
     if (name.Name == "FooLibrary") 
     { 
      return typeof(FooClass).Assembly; 
     } 
     return null; 
    } 

này hoàn toàn bỏ qua các số phiên bản và thay thế các thư viện đã được nạp cho bất kỳ tài liệu tham khảo thư viện có tên là "FooLibrary". Bạn có thể sử dụng các thuộc tính khác của lớp AssemblyName nếu bạn muốn hạn chế hơn. FooClass có thể là bất kỳ lớp nào trong hội đồng FooLibrary.

+0

Điều này làm việc hoàn hảo với MSTest chạy dưới TFS Xây dựng mà không nhận các tập tin cấu hình. –

+0

Tôi đã gặp một số vấn đề trong trình gỡ lỗi, nơi sự kiện này chỉ xảy ra đối với các hội đồng tài nguyên. Trong các tác phẩm sản xuất như một sự quyến rũ. Cảm ơn! –

2

Một cách để làm là tạo ứng dụng khởi động khi được khởi chạy sẽ bắt đầu ứng dụng gốc của bạn trong một miền ứng dụng riêng biệt. Khi bạn thiết lập tên miền mới, bạn sẽ có thể xây dựng tệp cấu hình theo lập trình.

+0

bạn có ý gì khi viết tệp cấu hình? Tôi không muốn sửa đổi chương trình, tôi muốn chạy ứng dụng của mình như thể cấu hình của tôi đã được sửa đổi. – sebagomez

+2

không sửa đổi - xây dựng. Nội dung của tệp cấu hình là một trong các tham số mà bạn có thể chuyển sang phương thức AppDomain.CreateDomain (bên trong cá thể AppDomainSetup). Bằng cách này bạn có thể xây dựng nó trên bay – mfeingold

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