2011-09-30 25 views
5

Tôi có CompileAssemblyFromSource làm việc cho mã chỉ tham khảo các assembly mà chương trình của tôi (biên dịch nó) sử dụng. Nó hoạt động rất đẹp.C# CompileAssemblyFromSource, thêm hội đồng tham chiếu cần thiết?

Tuy nhiên, nếu tôi cần biên dịch mã có "sử dụng blah;" tuyên bố, nó sẽ không thể tìm thấy blah và nói rằng nó thiếu một nguồn tài nguyên.

Vì vậy, nếu đó là "System.Windows.Forms" và tôi nói "compilerparams.ReferencedAssemblies.Add (" System.Windows.Forms.dll ")", nó hoạt động.

Vì vậy, tôi có thể phân tích cú pháp tệp mã và nhận tất cả các tham số "đang sử dụng", nhưng làm cách nào để biết rằng các thông số đó được cho là "* .dll", hoặc chúng là không gian tên ở nơi khác hoặc không có gì? Có cách nào cho. NET để có trong "System.Windows.Forms" và nhổ ra "System.Windows.Forms.dll" bởi vì đó là những gì nó cần và như vậy?

+0

Không có cách nào để tìm xem assembly nào chứa các lớp của bạn vì không gian tên có thể sinh ra acr oss các asseblies và ai đó có thể tạo DLL với chính xác cùng một tên lớp và không gian tên bạn sử dụng, do đó, mã của bạn không thể biên dịch. Để giải quyết vấn đề, bạn phải cung cấp các tệp nhị phân, nói, các cụm vệ tinh, được bao gồm làm tham chiếu cùng với mã nguồn của bạn theo cách tương tự, Visual Studio giữ tham chiếu (bao gồm cả băm) –

+0

Còn về 'Assembly.GetAssembly (typeof) (MyType)) '?? Bạn sẽ phải biết những loại thực sự được sử dụng, không chỉ là các câu lệnh sử dụng, bởi vì một không gian tên duy nhất có thể đến từ nhiều assembly trên @ArturMustafin – mellamokb

+0

@mellamokb: Nếu bạn mã như sau: 'Assembly.GetAssembly (typeof (MyType)) ', có nghĩa là kiểu' MyType' được biết ở thời gian tuân thủ (yêu cầu để sử dụng bởi câu lệnh 'typeof'), hoặc chính mã đó hoặc trong nguồn đang được biên dịch, không phải như vậy. Trong trường hợp của bạn, bạn phải cung cấp phương thức phân giải cho trình xử lý sự kiện AppDomain.AssemblyResolve để định vị và tải xuống các assembly. Nhưng, dù sao, như nó được nói, bạn không thể chỉ dựa vào một mã nguồn để giải quyết vấn đề –

Trả lời

1
  1. Đọc bài viết How the Runtime Locates Assemblies
  2. Trước khi biên dịch mã tải tất cả các hội đồng được tìm thấy ở các địa điểm nêu tại điểm 1
  3. tải tất cả các loại trong tất cả các hội đồng và giữ một cuốn từ điển của không gian tên, loại cặp
  4. Khi sử dụng được gặp phải trong nguồn, hãy thử thêm tham chiếu của các cụm từ từ điển trong 3
Các vấn đề liên quan