草庐IT

c# - 使用 Roslyn 的编译时源代码修改

是否可以在CI服务器上的MSBuild任务中使用Roslyn在编译之前修改源代码?我已经成功地在VS中完成了我想做的事情,但我想知道在VS之外是否有可能。目前我正在查看WorkspaceAPI和CompilerAPI,它们似乎是实现这一目标的正确工具,但我仍然不确定这是否可能?特别是我担心返回我对MSBuild所做的更改以允许它继续其工作。 最佳答案 这绝对是我们正在考虑的场景。今天有几个问题让它变得有点困难:您不能使用WorkspaceAPI加载项目/解决方案,因为您已经在msbuild中。要使用常规编译器API,您需要自己构建一

c# - 使用 Roslyn 的编译时源代码修改

是否可以在CI服务器上的MSBuild任务中使用Roslyn在编译之前修改源代码?我已经成功地在VS中完成了我想做的事情,但我想知道在VS之外是否有可能。目前我正在查看WorkspaceAPI和CompilerAPI,它们似乎是实现这一目标的正确工具,但我仍然不确定这是否可能?特别是我担心返回我对MSBuild所做的更改以允许它继续其工作。 最佳答案 这绝对是我们正在考虑的场景。今天有几个问题让它变得有点困难:您不能使用WorkspaceAPI加载项目/解决方案,因为您已经在msbuild中。要使用常规编译器API,您需要自己构建一

c# - CSC : error CS7038: Failed to emit module

安装VisualStudio2015并构建我的项目后,我收到错误"CSC:errorCS7038:Failedtoemitmodule".但是我的解决方案在VisualStudio2013中构建良好。这是一个ASP.NETwebforms项目.NET4.0有人吗?更新:看起来问题与RedGateSmartAssembly以及具有默认值的方法参数有关。更新:SmartAssembly6.9为我修复了错误。 最佳答案 原始片段:privatevoidradButton1_Click(objectsender,EventArgse){st

c# - CSC : error CS7038: Failed to emit module

安装VisualStudio2015并构建我的项目后,我收到错误"CSC:errorCS7038:Failedtoemitmodule".但是我的解决方案在VisualStudio2013中构建良好。这是一个ASP.NETwebforms项目.NET4.0有人吗?更新:看起来问题与RedGateSmartAssembly以及具有默认值的方法参数有关。更新:SmartAssembly6.9为我修复了错误。 最佳答案 原始片段:privatevoidradButton1_Click(objectsender,EventArgse){st

c# - 动态调用时出现 RuntimeBinderInternalCompilerException

在将对象作为动态参数传递时,我遇到了意外的RuntimeBinderInternalCompilerException。我将尝试解释该场景,因为它涉及面太广,无法轻松粘贴代码。我正在使用Roslyn进行一些非常奇怪的黑客攻击,所以这听起来很奇怪。执行申请监控源代码的变化使用更改的文件/类重新编译程序集的有效差异将新编译的程序集加载到原始AppDomain中将现有对象实例作为动态传递给新的/更改的代码,以便新代码可以在现有的上下文/应用程序状态上运行。这种动态传递应该有效,因为类型是兼容的:即,在我的例子中,我可以保证它具有功能匹配的方法/类型。但是当我去执行changed+reload

c# - 动态调用时出现 RuntimeBinderInternalCompilerException

在将对象作为动态参数传递时,我遇到了意外的RuntimeBinderInternalCompilerException。我将尝试解释该场景,因为它涉及面太广,无法轻松粘贴代码。我正在使用Roslyn进行一些非常奇怪的黑客攻击,所以这听起来很奇怪。执行申请监控源代码的变化使用更改的文件/类重新编译程序集的有效差异将新编译的程序集加载到原始AppDomain中将现有对象实例作为动态传递给新的/更改的代码,以便新代码可以在现有的上下文/应用程序状态上运行。这种动态传递应该有效,因为类型是兼容的:即,在我的例子中,我可以保证它具有功能匹配的方法/类型。但是当我去执行changed+reload

c# - VS 2017 Bug 或新功能?

升级到VS2017后,我从这段代码中得到以下错误(一直运行良好)byte[]HexStringToByteArray(stringhex){if(hex.Length%2==1)thrownewException("Thebinarykeycannothaveanoddnumberofdigits");byte[]arr=newbyte[hex.Length>>1];for(inti=0;i>1;++i)//Errorinthisline{arr[i]=(byte)((GetHexVal(hex[i异常(exception):Error1:Thevariable'i'cannotbeu

c# - VS 2017 Bug 或新功能?

升级到VS2017后,我从这段代码中得到以下错误(一直运行良好)byte[]HexStringToByteArray(stringhex){if(hex.Length%2==1)thrownewException("Thebinarykeycannothaveanoddnumberofdigits");byte[]arr=newbyte[hex.Length>>1];for(inti=0;i>1;++i)//Errorinthisline{arr[i]=(byte)((GetHexVal(hex[i异常(exception):Error1:Thevariable'i'cannotbeu

c# - "Avoid allocations in compiler hot paths"Roslyn 编码约定

我一直在阅读ContributingCode.NET编译器平台(“Roslyn”)的部分,我遇到了编码约定指南。我了解大多数编码约定以及他们为什么会要求它。但我不明白他们的意思:Avoidallocationsincompilerhotpaths:AvoidLINQ.Avoidusingforeachovercollectionsthatdonothaveastructenumerator.什么是“编译器热路径”?为什么我应该避免使用LINQ并避免对没有结构枚举器的集合执行foreach? 最佳答案 编译器hotpaths是编译器中

c# - "Avoid allocations in compiler hot paths"Roslyn 编码约定

我一直在阅读ContributingCode.NET编译器平台(“Roslyn”)的部分,我遇到了编码约定指南。我了解大多数编码约定以及他们为什么会要求它。但我不明白他们的意思:Avoidallocationsincompilerhotpaths:AvoidLINQ.Avoidusingforeachovercollectionsthatdonothaveastructenumerator.什么是“编译器热路径”?为什么我应该避免使用LINQ并避免对没有结构枚举器的集合执行foreach? 最佳答案 编译器hotpaths是编译器中