5

Tôi đang tạo Web User Controls qua mã (đánh dấu viết mã C# của tôi, mã sau và thiết kế tệp trên đĩa trên gọi lại). Các điều khiển được tạo ra tất cả tiền phạt. Tôi có thể thêm chúng vào dự án web của tôi và đặt chúng trên một trang.Đang tải điều khiển ASCX được tạo động (thông qua mã)

Khi tôi cố gắng để tải hiển thị bằng LoadControl(path) nó nói:

Unable to load type 'MyNameSpace.UseControlClass' 

đó là vì kiểm soát chưa được biên dịch.

Nhưng yêu cầu của tôi là tải điều khiển động mà không cần biên dịch lại giải pháp.

Tôi chỉ có thể biên dịch điều khiển người dùng khi tạo tệp kiểm soát? Vì đây có vẻ là lối thoát duy nhất.

EDIT: - Điều tôi đoán là tệp chưa được biên soạn nhưng không được phép tải theo thời gian chạy. Tôi đã cố gắng để biên dịch các tập tin mã bằng cách sử dụng CodeDom trình biên dịch. Giống như:

var filePath = Server.MapPath(path); 
var provider = CSharpCodeProvider.CreateProvider("C#"); 
var opts = new CompilerParameters(new[] { "mscorlib.dll", "System.Web.dll", 
           "Telerik.Web.Design.dll", "Telerik.Web.UI.dll", 
           "Telerik.Web.UI.Skins.dll", "MyCurrentDll.dll"}); 
opts.GenerateExecutable = false; 
opts.GenerateInMemory = true; 
var cr = provider.CompileAssemblyFromFile(opts, new string[] { filePath+".cs" }); 

Nhưng nó than phiền về cannot find metadata file Telerik.Web.Design.dll vv Tôi không muốn hardcode đường telerik vì nó có thể khác nhau trong hệ thống lưu trữ (mặc dù nó là trong bin của ứng dụng web hiện hành). Ngoài ra MyCurrentDll.dll là dll của tệp mà tôi đang biên dịch tệp mã. Làm cách nào tôi có thể giải quyết vấn đề này?

Ý tưởng của tôi là biên dịch tệp mã tạo dll động và sao chép tệp đó vào thư mục bin của ứng dụng web. Nó có thể giải quyết vấn đề ban đầu tôi đã nói.

EDIT 2: - Sau khi nhấn và dùng thử, tôi có thể biên dịch tệp mã động và tạo dll. Ngay cả sau khi tạo dll và đặt nó vào bin của ứng dụng của tôi Tôi không thể tải điều khiển người dùng bằng cách sử dụng virtual path. Tôi đã thử cách tiếp cận sau:

var asm = Assembly.Load("ddlPath"); 
var t = asm.GetType(fullTypeName);//NameSpace.Class 
var ctrl = LoadControl(t,null); 

ctrl được tải sau này. Tôi chỉ định thuộc tính Id và thêm nó vào điều khiển asp.net Panel. Nhưng nó không thể nhìn thấy sau khi postback: (

Bây giờ tôi phải thực hiện bằng cách nào đó các loại dll được biên dịch động có sẵn cho thời gian chạy (appdomain, có thể) để khi tôi điều khiển bằng đường dẫn ảo, nó được nạp đúng cách và không nhận được HtmlParseException hay tìm hiểu xem tại sao tải kiểm soát hình thức Type không hiển thị

PS: -. tôi đã tải một Label kiểm soát sử dụng Type và nó hoạt động đúng

+0

Đó là một câu hỏi thực sự thú vị. Tôi không thể nghĩ về một trường hợp sử dụng cho điều này - nhưng cách tôi thường tiếp cận này là có một hội đồng khác biết làm thế nào để xây dựng điều khiển và phát ra HTML vv tại thời gian chạy. Có lẽ một cách tiếp cận tương tự sẽ có thể ở đây bằng cách nhúng các điều khiển mới của bạn trong một hội đồng khác mà sau đó bạn có thể biên dịch và tải từ? Tôi sẽ xem câu hỏi này với sự quan tâm! – dash

+0

@dash Trường hợp Sử dụng là chúng tôi cho phép người dùng nhóm một số trường (với các loại đầu vào được xác định trước) và nhận dữ liệu nhập từ người dùng cuối. Tôi muốn tạo điều khiển người dùng, nhúng các trường này. – TheVillageIdiot

+0

Các điều khiển và trang lưu trữ của bạn có trong CodeFile thay vì CodeBehind không? – jbl

Trả lời

2

Cuối cùng, tôi đã có thể giải quyết vấn đề. Sau đây là chiến lược tôi thông qua:

  1. Tạo tập tin văn bản có chứa cấu trúc của CodeBehind, MarkupDesigner đang
  2. Đọc thông tin như những gì trường nào được tạo.
  3. Đặt đánh dấu cho các điều khiển cần thiết trong trình tạo chuỗi.
  4. đặt một số thông tin liên quan khác vào xây dựng chuỗi hơn
  5. Write file

Sau này, tôi đã tạo ra dll sử dụng CodeDome biên dịch. Vấn đề chính phải đối mặt trong quá trình biên soạn, như mô tả trong Edit một phần của câu hỏi, đã không tìm thấy cụm tham chiếu, trong đó đã được giải quyết bằng cách đặt con đường của con đường bin thư mục cùng với tên file dll như:

Server.MapPath("~/bin")+"\\Telerik.Web.dll" 

, vv

Sự cố tiếp theo được nêu trong EDIT2 đơn giản hơn một chút. Có khá thay đổi. Đã xảy ra sự cố trong điều khiển người dùng khác được nhúng trong điều khiển người dùng được tạo động.

Ngay cả sau khi tôi không thể tải điều khiển vào trang từ nơi tôi đã biên dịch mã. Điều này đã được giải quyết khi tôi tải điều khiển trong một trang khác. Thời gian chạy có thể giải quyết loại từ biên dịch động dll.

+0

Bạn có thể đánh dấu câu trả lời của mình được chấp nhận để câu trả lời đó bị xóa khỏi hàng đợi chưa được trả lời không? –

1

hmm .. có bạn xem là sử dụng. App_Code folder cho mục đích này?

Chứa mã nguồn cho các lớp học và đối tượng kinh doanh được chia sẻ (đối với các tệp ví dụ, ..cs và .vb) mà bạn muốn biên dịch như một phần của ứng dụng . Trong một dự án trang Web được biên dịch động, ASP.NET biên dịch mã trong thư mục App_Code theo yêu cầu ban đầu thành ứng dụng của bạn. Các mục trong thư mục này sau đó được biên dịch lại khi phát hiện bất kỳ thay đổi nào của .

+0

điều này sẽ không giúp tôi vì tôi đang tạo điều khiển người dùng và các tệp cũng được tạo tự động khi chạy. vấn đề là tải các tệp đã tạo trong miền ứng dụng để tạo đối tượng điều khiển. tôi đã giải quyết và sẽ sớm trả lời. – TheVillageIdiot

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