【问题标题】:Add class to compiled assembly (in memory)将类添加到已编译的程序集(在内存中)
【发布时间】:2015-12-03 17:18:23
【问题描述】:

由于CompileAssemblyFromSource add custom functions in a smart way 被忽略了,我会以不同的方式提出这个问题,所以人们会费心去阅读它。

切入正题,我正在通过将新语法“翻译”成 c# 并以这种方式在内存中编译它来制作一种语言。

using (Microsoft.CSharp.CSharpCodeProvider CodeProv =
    new Microsoft.CSharp.CSharpCodeProvider())
    {
        CompilerResults results = CodeProv.CompileAssemblyFromSource(
             new System.CodeDom.Compiler.CompilerParameters()
             {
                 GenerateInMemory = true
             },
             code);

         var type = results.CompiledAssembly.GetType("MainClass");

         var obj = Activator.CreateInstance(type);

         var output = type.GetMethod("Execute").Invoke(obj, new object[] { });

         Console.WriteLine(output);
    }

基本上我正在执行写在code 变量中的“主”函数。 我在代码变量中使用了一些函数,我想在不将其添加为底部的字符串的情况下将其包含在内,如下所示:

        code += @"public void Write(string path, object thevar)
        {
        if (thevar.GetType() == typeof(string))
        {
        System.IO.File.WriteAllText(path,(string)thevar);
        }
        if (thevar.GetType() == typeof(string[]))
        {
        System.IO.File.WriteAllLines(path,(string[])thevar);
        }
        }";

我能否以某种方式在 VS 中从我的实际主项目中添加一个类并让已编译的内存代码访问它?无需将其添加为字符串。

【问题讨论】:

  • 您不能将现有程序集添加为引用吗?此外,使用 Roslyn 这应该更容易。 Codedom 并不完全是现代的。
  • 关于堆栈溢出的使用,您的新问题更容易理解。我建议删除旧的并将第一段放在这里。
  • 如果我理解正确,而不是像你那样调用Invoke,你可以将GetMethod(一个MethodInfo对象)的结果传递给你的类并让it 呼叫Invoke。是这个意思吗?
  • 我认为他实际上是指添加一个类文件作为已编译代码的可访问引用,就像您可以将编译器的字符串添加到添加类一样。不知道我会怎么做

标签: c# in-memory


【解决方案1】:

您可以将源代码文件作为资源嵌入。使用这种技术,您可以在 Visual Studio 中编辑文件并在运行时访问文件的内容,就像它是一个字符串一样。

此链接显示了如何执行此操作: https://stackoverflow.com/a/433182/540832

【讨论】:

  • 我将一个类作为文件添加到我的资源中并添加了这个:parameters.EmbeddedResources.Add("Resources.resx"); 但我仍然无法访问该类
  • 我更新了答案,提供了更详细说明的链接。
  • 我显然编译了它,但我仍然无法访问它,它在当前上下文中不存在
  • 如果您查看生成的 cs 文件,您可以获得合格的命名空间,这可能是您所缺少的。
猜你喜欢
  • 2015-08-02
  • 2014-08-03
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多