Ich erstelle Web User Controls
über Code (meine C# -Code-Schreib-Markup-, Code-Behind-und Designer-Dateien auf der Festplatte auf einen Rückruf). Die Steuerelemente sind alle in Ordnung. Ich kann sie zu meinem Webprojekt hinzufügen und sie auf eine Seite stellen.Loading ASCX-Steuerelement dynamisch erstellt (über Code)
Wenn ich versuche, um die Steuerung zu laden LoadControl(path)
mit ihm sagt:
Unable to load type 'MyNameSpace.UseControlClass'
die wegen Kontrolle ist noch nicht erstellt.
Aber meine Anforderung besteht darin, Steuerelemente dynamisch zu laden, ohne die Lösung neu zu kompilieren.
Wie kann ich das Benutzersteuerelement nur kompilieren, wenn ich die Steuerdateien erstelle? Dies scheint der einzige Ausweg zu sein.
BEARBEITEN: - Was meine Vermutung ist, dass, da die Datei noch nicht kompiliert ist, es nicht erlaubt ist, von Laufzeit geladen werden. Ich habe versucht, die Codedatei mit CodeDom
Compiler zu kompilieren. Wie:
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" });
Aber es klagt cannot find metadata file Telerik.Web.Design.dll
über usw. Ich will nicht den telerik Weg codieren, wie es in gehostete System anders sein könnte (obwohl es in den bin
des aktuellen Web-App ist). Auch MyCurrentDll.dll
ist die DLL der Datei, aus der ich die Codedatei kompiliere. Wie kann ich das beheben?
Meine Idee ist, die Codedatei zu kompilieren, erstellen Sie eine dll
dynamisch und kopieren Sie es in Webanwendung bin
Verzeichnis. Es könnte das von mir ursprünglich gestellte Problem lösen.
BEARBEITEN 2: - Nach Treffer und Test kann ich die Codedatei dynamisch kompilieren und dll
generieren. Auch nachdem ich eine DLL erzeugt habe und sie in bin
meiner Anwendung platziert habe, kann ich keine Benutzersteuerung mit virtual path
laden. Ich habe den folgenden Ansatz versucht:
var asm = Assembly.Load("ddlPath");
var t = asm.GetType(fullTypeName);//NameSpace.Class
var ctrl = LoadControl(t,null);
Die Strg wird nach diesem geladen. Ich weise seine Eigenschaft Id
zu und füge sie zu einem asp.net Panel
Steuerelement hinzu. Aber es ist nicht sichtbar nach dem Postback :(
Jetzt muss ich entweder irgendwie die dynamisch kompilierten DLL-Typen für die Laufzeit zur Verfügung stellen (appdomain, vielleicht), so dass wenn ich die Steuerung mit virtuellen Pfad laden wird es richtig geladen und ich nicht bekommen HtmlParseException
oder herauszufinden, warum Verladesteuerung Form Type
nicht auftauchend
PS: -. ich habe geladen, um eine Label
Steuerung mit Type
und es ordnungsgemäß funktioniert
Das ist eine wirklich interessante Frage. Ich kann mir dafür keinen Anwendungsfall vorstellen - aber die Art, wie ich das normalerweise anwende, ist eine andere Assembly, die weiß, wie man Steuerelemente erstellt und zur Laufzeit den HTML-Code usw. ausgibt. Vielleicht wäre hier ein ähnlicher Ansatz möglich, indem Sie Ihre neuen Steuerelemente in eine andere Assembly einbetten, aus der Sie dann kompilieren und laden können. Ich werde diese Frage mit Interesse verfolgen! – dash
@dash Der Use Case erlaubt es dem Benutzer, einige Felder (mit vordefinierten Eingabetypen) zu gruppieren und Eingaben vom Endbenutzer zu erhalten. Ich möchte ein Benutzersteuerelement erstellen und diese Felder einbetten. – TheVillageIdiot
Sind Ihre Steuerelemente und Hosting-Seite in CodeFile anstelle von CodeBehind? – jbl