The*_*iot 5 c# asp.net user-controls dynamic-compilation webusercontrol
我正在Web User Controls通过代码创建(我的C#代码写出标记,代码隐藏和设计器文件在回调中写入磁盘).控件创建得很好.我可以将它们添加到我的web项目中并将它们放在页面上.
当我尝试使用LoadControl(path)它加载控件时说:
Unable to load type 'MyNameSpace.UseControlClass'
Run Code Online (Sandbox Code Playgroud)
这是因为尚未编译控件.
但我的要求是动态加载控件而不重新编译解决方案.
如何在创建控制文件时编译用户控件?因为这似乎是唯一的出路.
编辑: - 我的猜测是,由于文件尚未编译,因此不允许运行时加载.我试图使用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" });
Run Code Online (Sandbox Code Playgroud)
但是,抱怨cannot find metadata file Telerik.Web.Design.dll等等.我不想硬编码Telerik的路径,因为它可能会在托管系统不同(虽然它是在bin当前Web应用程序).也是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);
Run Code Online (Sandbox Code Playgroud)
在此之后加载ctrl.我分配其Id属性并将其添加到asp.net Panel控件.但是在回发后它是不可见的:(
现在我要么必须以某种方式制作运行时可用的动态编译的dll类型(appdomain,也许),这样当我使用虚拟路径加载控件时它已正确加载,我不明白HtmlParseException或弄清楚为什么加载控件表单Type没有显示起来.
PS: - 我已经加载了一个Label控件Type并且它正常工作.
最后我能够解决这个问题。以下是我采取的策略:
CodeBehind,结构Markup和Designer代码的文本文件之后我创建了dllusingCodeDome编译器。正如问题部分所述,编译期间面临的主要问题Edit是找不到引用的程序集,这是通过将bin目录路径的路径与 dll 文件名一起解决的,如下所示:
Server.MapPath("~/bin")+"\\Telerik.Web.dll"
Run Code Online (Sandbox Code Playgroud)
ETC。
中概述的下一个问题EDIT2要简单一些。有相当白痴。动态生成的用户控件中嵌入的另一个用户控件存在一些问题。
即使在此之后,我也无法将控件加载到编译代码的页面中。当我在另一个页面加载控件时,这个问题得到了解决。运行时能够解析动态编译的类型dll。
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |