首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSharpCodeProvider符合接口

CSharpCodeProvider符合接口
EN

Stack Overflow用户
提问于 2011-11-25 20:23:42
回答 3查看 667关注 0票数 3

我有一个CSharpCodeProvider,它接受一个类的代码。在编译代码的项目中,我有一个接口。我希望我正在编译的代码符合这个接口。

这是我能想到的最简单的例子来说明我的问题。我有一个包含两个文件的项目:

Program.cs:

代码语言:javascript
复制
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //set up the compiler
            CSharpCodeProvider csCompiler = new CSharpCodeProvider();

            CompilerParameters compilerParameters = new CompilerParameters();
            compilerParameters.GenerateInMemory = true;
            compilerParameters.GenerateExecutable = false;

            var definition = 
@"class Dog : IDog
{
    public void Bark()
    {
        //woof 
    }
}";    
            CompilerResults results = csCompiler.CompileAssemblyFromSource(compilerParameters, new string[1] { definition });

            IDog dog = null;
            if (results.Errors.Count == 0)
            {
                Assembly assembly = results.CompiledAssembly;
                dog = assembly.CreateInstance("TwoDimensionalCellularAutomatonDelegate") as IDog;
            }

            if (dog == null)
                dog.Bark();
        }
    }
}

IDog.cs:

代码语言:javascript
复制
namespace ConsoleApplication1
{
    interface IDog
    {
        void Bark();
    }
}

我似乎想不出如何让CSharpCodeProvider识别IDog。我尝试过compilerParameters.ReferencedAssemblies.Add("ConsoleApplication1");,但它不起作用。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-13 13:07:59

解决方案是引用当前正在执行的程序集。

代码语言:javascript
复制
var location = Assembly.GetExecutingAssembly().Location;
compilerParameters.ReferencedAssemblies.Add(location);
票数 1
EN

Stack Overflow用户

发布于 2011-11-26 01:37:16

尝尝这个

代码语言:javascript
复制
using System;
using System.IO;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //set up the compiler
            CSharpCodeProvider csCompiler = new CSharpCodeProvider();

            CompilerParameters compilerParameters = new CompilerParameters();
            compilerParameters.GenerateInMemory = true;
            compilerParameters.GenerateExecutable = false;
            compilerParameters.ReferencedAssemblies.Add("System.dll");

            var definition = File.ReadAllText("./IDog.cs") +
@"public class Dog : ConsoleApplication1.IDog
{
    public void Bark()
    {
        System.Console.WriteLine(""BowWoW"");
    }
}";
            CompilerResults results = csCompiler.CompileAssemblyFromSource(compilerParameters,
                new string[1] { definition });

            dynamic dog = null;
            if (results.Errors.Count == 0)
            {
                Assembly assembly = results.CompiledAssembly;
//              Type idog = assembly.GetType("ConsoleApplication1.IDog");
                dog = assembly.CreateInstance("Dog");
            } else {
                Console.WriteLine("Has Errors");
                foreach(CompilerError err in results.Errors){
                    Console.WriteLine(err.ErrorText);
                }
            }
            if (dog != null){
                dog.Bark();
            } else {
                System.Console.WriteLine("null");
            }
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-04-04 04:59:49

太棒了!可能会吧

代码语言:javascript
复制
IDog dog = (IDog)a.CreateInstance("Dog");
dog.Bark(/*additional parameters go here*/);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8269094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档