最近我开始阅读有关.NET重组细节的信息(主要是通过.NET Core github页面).它接缝他们创建了兄弟项目以支持更多平台.在阅读时我的印象是CoreCLR和CoreRT是一个新的OpenSource版本的专有Roslyn编译器.CoreRT提供本机(AOT)编译.而LLILC是一种备选实现指挥LLVM框架.
任何人都可以从用户角度确认和描述这些项目的差异和目标吗?为什么有人会在未来使用Roslyn而不是CoreCLR?
将对象作为动态参数传递时,我收到了意外的RuntimeBinderInternalCompilerException.
我将尝试解释这个场景,因为它太容易粘贴代码了.我正在和Roslyn做一些非常奇怪的讨厌,所以听起来很奇怪.
这种动态传递应该有效,因为类型是兼容的:即,在我的情况下,我可以保证它具有功能匹配的方法/类型.
但是当我去执行change + reloaded方法,并且它收到一个类型为dynamic的对象时,我得到了这个异常.
RuntimeBinderInternalCompilerException was unhandled.
An unexpected exception occurred while binding a dynamic operation
Run Code Online (Sandbox Code Playgroud)
每个MSDN:
此类异常与RuntimeBinderException的不同之处在于,RuntimeBinderException表示在通常的编译器错误意义上无法绑定,而RuntimeBinderInternalCompilerException表示运行时绑定程序本身的故障.
谷歌绝对没有结果.我不知道如何进一步调试它.有什么建议?
(我确实做了一些沙盒测试,以确保自己可以在运行时将不同的程序集加载到测试应用程序中,并将实例类型从不同的程序集传递给接受动态参数的单个方法.所以它在这种情况下有效.)
我有一个软件,可以根据用户操作为C#项目生成代码.我想创建一个GUI来自动编译解决方案,所以我不必加载Visual Studio只是为了触发重新编译.
我一直在寻找机会与Roslyn一起玩,并决定尝试使用Roslyn而不是msbuild来做到这一点.不幸的是,我似乎找不到以这种方式使用Roslyn的任何好资源.
谁能指出我正确的方向?
安装Visual Studio 2015并构建我的项目后,我收到错误
"CSC:错误CS7038:无法发出模块".
但是我的解决方案在Visual Studio 2013中正常运行.
它是一个ASP.NET webforms项目.NET 4.0
任何人?
更新:看起来问题与Red Gate Smart Assembly结合使用默认值的方法参数有关.
更新: Smart Assembly 6.9为我修复了错误.
升级到VS 2017后,我从此代码中得到以下错误(一直运行良好)
byte[] HexStringToByteArray(string hex)
{
if (hex.Length % 2 == 1)
throw new Exception("The binary key cannot have an odd number of digits");
byte[] arr = new byte[hex.Length >> 1];
for (int i = 0; i < hex.Length >> 1; ++i) // Error in this line
{
arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
}
return arr;
}
Run Code Online (Sandbox Code Playgroud)
例外:
Error 1: The variable 'i' cannot be used with type arguments
Error 2: 'hex' …Run Code Online (Sandbox Code Playgroud) 在旧的.net中,我们曾经能够运行csc编译器来编译单个cs文件或多个文件.使用.net核心,我们csc坚持拥有一个合适的项目文件.是否有一个独立的命令行编译器,它允许编译源代码文件而无需项目(并列出在同一命令行上引用的依赖项)?
在Linux上,当我安装了旧的csc和新的.net核心时,我得到了这些时间:
[root@li1742-80 test]# time dotnet build
Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
test -> /root/test/bin/Debug/netcoreapp2.0/test.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:03.94
real 0m7.027s
user 0m5.714s
sys 0m0.838s
[root@li1742-80 test]# time csc Program.cs
Microsoft (R) Visual C# Compiler version 2.3.0.61801 (3722bb71)
Copyright (C) Microsoft Corporation. All rights reserved.
real 0m0.613s
user 0m0.522s
sys 0m0.071s
[root@li1742-80 test]#
Run Code Online (Sandbox Code Playgroud)
使用.net核心注意7秒,使用旧csc注意几百毫秒dotnet build.
我希望能够使用.net核心快速编译,因为我曾经能够使用csc.
是否可以在CI服务器上的MSBuild任务中使用Roslyn进行编译之前修改源代码?我已经成功地在VS中做了我想要的但是我想知道在VS之外是否可能.目前我正在研究Workspace API和Compiler API,它们似乎是实现这一目标的正确工具,但我仍然不确定它是否可行?特别是我担心返回我对MSBuild所做的更改以允许它继续工作.
我们刚刚在代码中找到了这些:
public static class ObjectContextExtensions
{
public static T Find<T>(this ObjectSet<T> set, int id, params Expression<Func<T, object>>[] includes) where T : class
{
...
}
public static T Find<T>(this ObjectSet<T> set, int id, params string[] includes) where T : class
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,除了params.之外,它们具有相同的签名.
它们被用于多种方式,其中之一:
DBContext.Users.Find(userid.Value); //userid being an int? (Nullable<int>)
Run Code Online (Sandbox Code Playgroud)
对我来说奇怪的是,它解决了第一次超载.
Q1:为什么这不会产生编译错误?
Q2:为什么C#编译器将上述调用解析为第一种方法?
编辑:只是为了澄清,这是C#4.0,.Net 4.0,Visual Studio 2010.
我刚刚在Azure上创建了一个新的VM(使用Azure团队从图库中提供的图像)和即将在线出现的Visual Studio 2014的CTP版本,用于测试它,特别是使用新的C#6.0功能.
但是,它没有为开箱即用的C#6.0提供支持,因为没有语言扩展(主构造函数,属性初始化器,安全导航操作员)在那里工作.
MSDN上的博客条目建议将以下内容添加到项目设置中:
<LangVersion>Experimental</LangVersion>
Run Code Online (Sandbox Code Playgroud)
但这在我的控制台项目中没有任何改变.即使是第二个链接的示例代码也根本不编译.

我错过了什么吗?