未能找到路径“binroslyncsc.exe”的一部分 的解决办法

未能找到路径“binroslyncsc.exe”的一部分 的解决办法,第1张

在Visual Stuido中让派搜从Git或SVN迁出Asp.Net MVC项目到本地,编译运行时经常遇到如下问题:

未能找到路径“\bin\roslyn\csc.exe”的一部分

在网上搜了一些解决办法,一个羡禅方法是将其它项目中roslyn目录直接拷贝到bin目录下,这种方法可行,但感觉没有从根上解决问题。还有建议在NuGet程序包里引用Microsoft.CodeDom.Providers.DotNetCompilerPlatform和Microsoft.Net.Compilers程序集,然后重新编译,可是项目中已经有了这两项引用;另外一种解决方案就是移除这两项依赖,但很多项目移除依赖后根本连编译都通不过。这个问题奇怪之处在于创建新的项目坦历没有这个问题,那么只要克隆过来的项目与新建项目一样,问题就会消除。最后发现解决方案很简单,就是在重新编译之前,执行清除解决方案,问题就解决了。

如何用C#动态编译、执行代码

在开始之前,先熟悉困中几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。

一、CSharpCodeProvider

提供对C#代码生成器和代码编译器的实例的访问。如蚂尺敬果要动态生成VB代码,可以使用VBCodeProvider。

CreateCompiler():获取编译器的实例。

二、ICodeCompiler

定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回指示编译结果的CompilerResults对象。

CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。

三、CompilerParameters

表示用闷慎于调用编译器的参数。

ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。

GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。

GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。

四、CompilerResults

表示从编译器返回的编译结果。

CompiledAssembly:获取或设置以编译的程序集,Assembly类型。

五、Assembly

就是程序集了(不知道如何描述了)。

大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:

using System

using System.Reflection

using System.Globalization

using Microsoft.CSharp

using System.CodeDom

using System.CodeDom.Compiler

using System.Text

namespace ConsoleApplication1

{

public class Program

{

static void Main(string[] args)

{

// 1.CSharpCodePrivoder

CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider()

// 2.ICodeComplier

ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler()

// 3.CompilerParameters

CompilerParameters objCompilerParameters = new CompilerParameters()

objCompilerParameters.ReferencedAssemblies.Add("System.dll")

objCompilerParameters.GenerateExecutable = false

objCompilerParameters.GenerateInMemory = true

// 4.CompilerResults

CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode())

if (cr.Errors.HasErrors)

{

Console.WriteLine("编译错误:")

foreach (CompilerError err in cr.Errors)

{

Console.WriteLine(err.ErrorText)

}

}

else

{

// 通过反射,调用HelloWorld的实例

Assembly objAssembly = cr.CompiledAssembly

object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld")

MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut")

Console.WriteLine(objMI.Invoke(objHelloWorld, null))

}

Console.ReadLine()

}

static string GenerateCode()

{

StringBuilder sb = new StringBuilder()

sb.Append("using System")

sb.Append(Environment.NewLine)

sb.Append("namespace DynamicCodeGenerate")

sb.Append(Environment.NewLine)

sb.Append("{")

sb.Append(Environment.NewLine)

sb.Append("public class HelloWorld")

sb.Append(Environment.NewLine)

sb.Append("{")

sb.Append(Environment.NewLine)

sb.Append("public string OutPut()")

sb.Append(Environment.NewLine)

sb.Append("{")

sb.Append(Environment.NewLine)

sb.Append(" return \"Hello world!\"")

sb.Append(Environment.NewLine)

sb.Append("}")

sb.Append(Environment.NewLine)

sb.Append("}")

sb.Append(Environment.NewLine)

sb.Append("}")

string code = sb.ToString()

Console.WriteLine(code)

Console.WriteLine()

return code

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12451170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存