假设代码如下:
public class DynamicAspxHandler : IHttpHandler {
bool IHttpHandler.IsReusable { get { return false; } }
void IHttpHandler.ProcessRequest(HttpContext httpContext) {
string aspxContent = PlainASPXContent();
Page page = CreatePage(httpContext, aspxContent);
page.ProcessRequest(httpContext);
}
Page CreatePage(HttpContext context, string aspxContent) {
// How to implement this?
}
}
Run Code Online (Sandbox Code Playgroud)
如何实现CreatePage方法基于ASPX的纯字符串内容实例化页面?
注意,ASPX字符串本身可以包含对磁盘上已存在的MasterPage的引用.
我意识到这一点必然存在巨大的性能问题,但在这个阶段我只想知道如何做到这一点.显然我必须缓存结果.
谢谢.
使用.NET 2.0.
System.Drawing 在我的参考文献列表中.
这是我的using发言:
using System.Drawing;
Run Code Online (Sandbox Code Playgroud)
这是代码:
private static Rectangle rScreen;
Run Code Online (Sandbox Code Playgroud)
这是这一行的错误:
错误文本:命名空间"System.Drawing"中不存在类型或命名空间名称"Rectangle"(您是否缺少程序集引用?)
为什么?
编辑:添加编译代码:
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("CompilerVersion", "v3.5");
CSharpCodeProvider codeProvider = new CSharpCodeProvider(dict);
CompilerParameters parameters = new CompilerParameters();
{
parameters.ReferencedAssemblies.Add("System.Drawing.dll");
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");
parameters.ReferencedAssemblies.Add("System.Data.dll");
parameters.ReferencedAssemblies.Add("System.Data.Linq.dll");
parameters.ReferencedAssemblies.Add("System.DirectoryServices.dll");
parameters.ReferencedAssemblies.Add("System.Configuration.dll");
parameters.ReferencedAssemblies.Add("System.Web.dll");
parameters.ReferencedAssemblies.Add("System.Xml.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
parameters.ReferencedAssemblies.Add("System.Web.Services.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
parameters.ReferencedAssemblies.Add("System.IdentityModel.dll");
parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.Common.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));
parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.WebForms.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));
}
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sources.ToArray());
try
{
ApexAssemblyManager.dynamicAssemblies.Add(hashKey, new DynamicAssemlby(results.CompiledAssembly));
return ApexAssemblyManager.dynamicAssemblies[hashKey].CreateInstance(typeName);
}
Run Code Online (Sandbox Code Playgroud)
所有其他ReferencedAssemblies工作并且已经工作了很长时间.这是我第一次遇到这样的错误.
我确保并仔细检查添加了引用.如果我再次尝试将其添加到项目中,我会收到一条消息,表明该引用已存在.
谢谢
我目前正在开发一个haskell程序,它从文本框中获取用户输入,然后使用System.Plugins库编译并加载它,以便提取要绘制到屏幕的图片.用户可以在文本框中编辑代码,然后通过单击编译按钮重新加载新图像.以下是单击编译按钮时触发的代码:
compileText :: SourceView -> SOE.Window -> IO ()
compileText tview w = do
txtBuff <- textViewGetBuffer tview
startIt <- textBufferGetStartIter txtBuff
endIt <- textBufferGetEndIter txtBuff
compTime <- getClockTime
srcString <- textBufferGetByteString txtBuff startIt endIt False
BS.writeFile "Test.hs" srcString
mkStat <- make "Test.hs" []
case mkStat of
MakeSuccess cd fp -> print fp
MakeFailure (er1:er2:errs) -> error er2
loadResult <- getModule
case loadResult of
Right (md, pic) -> do
runGraphics $ do
draw3 "gtk test" pic w
unload …Run Code Online (Sandbox Code Playgroud) compiler-construction interpreter haskell dynamic-compilation
一般问题:
我可以racket从正在运行的Racket脚本中调用当前的可执行文件吗?
基本上,我想(system "racket ...")在(find-executable-path "racket")不返回我正在使用的Racket可执行文件的路径的情况下替换.
语境:
我真正想要的是尝试编译一些表达式并断言它们会引发编译错误.这是用于单元测试.
除了Janino之外,还有其他选项可以在v5中实时编译和执行Java代码吗?我知道v6有Compiler API,但我需要使用v5 VM.
我基本上需要获取一个包含完整Java类的字符串,编译它并将其加载到内存中.
我正在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 …
我在java程序中生成动态类,将所有代码写入java文件,将java文件编译为类文件,然后使用URLClassLoader加载类文件.这个问题是它在我的计算机上创建了很多文件.他们只是通过创建"虚拟文件"(文件对象)而不生成任何实际文件来实现这一点,因为我这样做的方式需要时间并且看起来不干净且效率低下.
感谢 这篇非常有见地的文章,我能够使用从端点获取的动态模板动态创建组件,但是这些组件是使用 RuntimeCompiler 在运行时编译的,在使用 AoT 编译(又称生产时)时会禁用该编译器。
有人知道适用于 AoT 的类似解决方案吗?
我的要求是:
在回答这个问题时,我了解到无法javax.tools从GAE应用程序调用Java Compiler .
这种限制是否仍适用?
如果是这样,我有什么选择将Java源代码"动态"编译成可加载的类文件?
java google-app-engine dynamic-compilation java-compiler-api
我正在尝试在C#中运行时编译代码,然后从编译的代码中调用一个函数或初始化一个在原始代码中定义的类.
我目前的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
namespace CTFGame
{
class Program
{
static void Main(string[] args)
{
string code = @"
using System;
namespace CTFGame
{
public class MyPlayer
{
public static void Main ()
{
Console.WriteLine(""Hello world"");
}
/*public void DoTurn ()
{
Program.SayHello();
}*/
}
}
";
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
if …Run Code Online (Sandbox Code Playgroud)