5

我正在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,它工作正常。

4

2 回答 2

2

最后我能够解决这个问题。以下是我采用的策略:

  1. 创建包含结构CodeBehind和代码Markup的文本文件Designer
  2. 阅读有关要创建哪些字段的信息。
  3. 为字符串构建器中所需的控件添加标记。
  4. 将一些其他相关信息放入更多字符串构建器中
  5. 写文件

在此之后,我创建了dllusingCodeDome编译器。如Edit部分问题所述,编译过程中面临的主要问题是找不到引用的程序集,这是通过将bin目录路径的路径与 dll 文件名一起解决的,例如:

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

等等

中概述的下一个问题EDIT2要简单一些。有相当愚蠢的。嵌入在动态生成的用户控件中的另一个用户控件存在一些问题。

即使在此之后,我也无法将控件加载到我编译代码的页面中。当我在另一个页面中加载控件时,这个问题得到了解决。运行时能够解析动态编译的类型dll

于 2012-04-20T09:09:50.603 回答
1

嗯..您是否考虑过为此目的使用App_Code 文件夹?

包含要编译为应用程序一部分的共享类和业务对象(例如 ..cs 和 .vb 文件)的源代码。在动态编译的网站项目中,ASP.NET 会根据对应用程序的初始请求编译 App_Code 文件夹中的代码。然后在检测到任何更改时重新编译此文件夹中的项目。

于 2012-04-19T13:26:29.697 回答