我正在创造Web User Controls
通过代码(我的 C# 代码写出标记、代码隐藏和设计器文件在回调时写入磁盘)。控件创建得很好。我可以将它们添加到我的网络项目中并将它们放在页面上。
当我尝试使用加载控件时LoadControl(path)
它说:
Unable to load type 'MyNameSpace.UseControlClass'
这是因为控件尚未编译。
但我的要求是动态加载控件而不重新编译解决方案。
如何只在创建控制文件时才编译用户控件?因为这似乎是唯一的出路。
EDIT:- 我的猜测是,由于该文件尚未编译,因此不允许运行时加载。我尝试使用编译代码文件CodeDom
编译器。喜欢:
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" });
但它抱怨cannot find metadata file Telerik.Web.Design.dll
我不想对 telerik 路径进行硬编码,因为它在托管系统中可能有所不同(尽管它位于bin
当前网络应用程序的)。还MyCurrentDll.dll
是我编译代码文件的文件的 dll。我该如何解决这个问题?
我的想法是编译代码文件创建一个dll
动态并将其复制到Web应用程序的bin
目录。它可能会解决我最初提出的问题。
EDIT 2:- 经过点击和试用后,我能够动态编译代码文件并生成dll
。即使生成 dll 并将其放入bin
我的应用程序我无法使用加载用户控件virtual path
。我尝试过以下方法:
var asm = Assembly.Load("ddlPath");
var t = asm.GetType(fullTypeName);//NameSpace.Class
var ctrl = LoadControl(t,null);
此后将加载 ctrl。我分配它的Id
属性并将其添加到asp.net Panel
控制。但回发后就看不到了:(
现在我要么必须以某种方式使动态编译的 dll 类型可用于运行时(也许是应用程序域),这样当我使用虚拟路径加载控件时,它就会被正确加载,并且我不会得到HtmlParseException
或者弄清楚为什么加载控制表单Type
没有出现。
PS:-我已经加载了Label
控制使用Type
并且它工作正常。