Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将类添加到编译的程序集(内存中)_C#_In Memory - Fatal编程技术网

C# 将类添加到编译的程序集(内存中)

C# 将类添加到编译的程序集(内存中),c#,in-memory,C#,In Memory,既然这个问题被忽略了,我将以不同的方式问这个问题,这样人们会费心去读它 切中要害的是,我正在通过将新语法“翻译”成c#并以这种方式在内存中编译来创建一种语言 using (Microsoft.CSharp.CSharpCodeProvider CodeProv = new Microsoft.CSharp.CSharpCodeProvider()) { CompilerResults results = CodeProv.CompileAssemblyFromSo

既然这个问题被忽略了,我将以不同的方式问这个问题,这样人们会费心去读它

切中要害的是,我正在通过将新语法“翻译”成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
变量中的“main”函数。 我在代码变量中使用了一些函数,我想包括这些函数,但没有将其作为字符串添加到底部,如下所示:

        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中实际的主项目中添加一个类,并让编译的内存代码访问它吗?无需将其作为字符串添加。

您可以将源代码文件作为资源嵌入。使用此技术,您可以在VisualStudio中编辑文件,并在运行时像访问字符串一样访问文件的内容

此链接显示了如何执行此操作:

无法将现有程序集添加为引用吗?另外,使用Roslyn应该更容易。Codedom并不完全是现代的。关于堆栈溢出的使用,您的新问题更容易理解。我建议删除旧的一段,并将第一段放在这里。如果我理解正确,您可以将
GetMethod
(MethodInfo对象)的结果传递给类,让它调用
Invoke
,而不是像您这样调用
Invoke
。这就是你的意思吗?我想他实际上是指添加一个类文件作为编译代码的可访问引用,就像你可以为编译器添加字符串来添加类一样。我不知道该怎么做我将一个类作为文件添加到我的资源中并添加了以下内容:
parameters.EmbeddedResources.Add(“resources.resx”)
但我仍然无法访问classI更新了答案,并提供了指向更详细说明的链接。显然,我编译了它,但仍然无法访问它,它在当前上下文中不存在。如果查看生成的cs文件,您可以获得符合条件的命名空间,它可能是您缺少的。