- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
现在我正在做一个项目,团队想要一种无需重新编译整个项目即可编写和编辑代码的方法,因此我决定尝试实现一个脚本引擎。
之前将 Lua 实现到 C++ 中,我并不是一个将脚本功能实现到项目中的新手。但是,我们想尝试使用 Microsoft.CSharp 命名空间并结合已内置到 C# 中的 System.Reflection 来直接实现 C#。
因此,听到这个消息后,我查阅了文档,并提出了一个几乎可以工作的原型(prototype)——但不完全是。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
namespace Scripting
{
class Program
{
static void Main(string[] args)
{
StringBuilder builder = new StringBuilder();
builder.Append("using System;");
builder.Append("using Scripting;");
builder.Append("class MyScript : IScript");
builder.Append("{");
builder.Append(" string ScriptName");
builder.Append(" {");
builder.Append(" get { return \"My Script\"; }");
builder.Append(" }");
builder.Append(" public bool Initialize()");
builder.Append(" {");
builder.Append(" Console.WriteLine(\"Hello, World!\");");
builder.Append(" return true;");
builder.Append(" }");
builder.Append("}");
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" });
param.GenerateInMemory = true;
param.GenerateExecutable = true;
CompilerResults result = provider.CompileAssemblyFromSource(param, builder.ToString());
if (result.Errors.Count > 0)
{
foreach (CompilerError error in result.Errors)
Console.WriteLine(error);
Console.ReadKey();
return;
}
}
}
}
我目前遇到的问题是我希望能够引用我的接口(interface) - IScript.cs(它在脚本命名空间内,因此是当前程序集) - 这样在编译器中编写和解析的脚本可以访问它。显然,我添加了 Scripting.dll 作为参数,但由于某种原因似乎无法访问它。我正在在调试中运行它,因此这可能会导致一些严重的面部表情。做什么?
有没有办法引用当前程序集并将其传递给 CompilerParameters?或者我真的搞砸了/我应该依赖于为脚本对象/等创建程序集吗?
最佳答案
它可能在错误的目录中查找。
通过typeof(Program).Assembly.CodeBase
来传递完整路径。
关于c# - 使用 CompilerParameters 引用当前程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657117/
我正在开发一个 ASP.Net C# 应用程序,用户可以在其中动态编译一段代码。在这种情况下,我使用的是 CSharpCodeProvider。 我刚刚遇到的问题是 CompilerParameter
现在我正在做一个项目,团队想要一种无需重新编译整个项目即可编写和编辑代码的方法,因此我决定尝试实现一个脚本引擎。 之前将 Lua 实现到 C++ 中,我并不是一个将脚本功能实现到项目中的新手。但是,我
我正在使用 RazorEngine解析应用程序中的 html 模板,并正在编写一些 NUnit 测试来分析性能区域并调查潜在问题。似乎在指定 GenerateInMemory = false 时,我的
我有一个 CompilerParameters 对象,我用它来提供一个 Microsoft.CSharp.CSharpCodeProvider 对象和一个派生自该对象的 ICodeCompiler 对
假设我在主项目中编译了如下代码串。但是我想在 CustomClass 中实现一个接口(interface)。该接口(interface)位于我的解决方案中的另一个项目中(我的主要项目中的部分引用)当我
我正在运行时编译动态程序集。它需要引用另一个 dll。一切正常,只要我在 CompilerParameters 中设置 OutputAssembly。但是一旦我设置 GenerateInMemory
我想在 Silverlight 中创建数学表达式评估器。 为了轻松做到这一点,我需要使用 System.Reflection、System.Reflection.Emit、System.CodeDom
我在 Windows 服务中运行了以下代码,即使在高并发性下也可以正常工作多年: CSharpCodeProvider codeProvider = new CSharpCodeProvider();
我正在使用 CodeDomProvider 类在运行时编译类。这适用于仅使用 System 命名空间的类: using System; public class Test { public S
我是一名优秀的程序员,十分优秀!