我正在Web User Controls
通过代码创建(我的 C# 代码写出标记、代码隐藏和设计器文件到磁盘上的回调)。控件都创建得很好。我可以将它们添加到我的网络项目中并将它们放在一个页面上。
当我尝试使用LoadControl(path)
它加载控件时说:
Unable to load type 'MyNameSpace.UseControlClass'
这是因为控件尚未编译。
但我的要求是动态加载控件而不重新编译解决方案。
如何仅在创建控件文件时编译用户控件?因为这似乎是唯一的出路。
编辑:-我的猜测是,由于该文件尚未编译,但运行时不允许加载它。我尝试使用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
目录中。它可能会解决我最初提出的问题。
编辑 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 类型可用于运行时(可能是 appdomain),这样当我使用虚拟路径加载控件时,它会被正确加载,我不明白HtmlParseException
为什么加载控件表单Type
没有显示向上。
PS:-我已经加载了一个Label
控件Type
,它工作正常。