我正在尝试运行从TFS源代码控制中检索的Asp.net MVC项目.我添加了所有程序集引用,我能够成功构建和编译,没有任何错误或警告.
但是我在浏览器中收到以下错误:
找不到路径'C:\ B8akWorkspace\B8akProject\B8akSolution\B8AK.Portal\bin\roslyn\csc.exe'的一部分.
以下是错误页面的完整屏幕截图.
经过几天的研究,我了解Roslyn是.Net编译器平台,提供高级编译功能.但是,我不明白为什么我的构建试图找到\ bin\roslyn\csc.exe,因为我没有配置任何与Roslyn相关的东西,也没打算在我的项目中使用Roslyn.
我安装了Roslyn.现在,如果我知道在Visual Studio中查看的位置,我可以打开"C#交互式窗口",然后运行代码:
> 5 + 3
8
Run Code Online (Sandbox Code Playgroud)
那很可爱.现在我该如何与我的代码进行交互-my类?假设我打开了一个项目.
> new Cog()
(1,5): error CS0246: The type or namespace name 'Cog' could not be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud) 我查看了http://referencesource.microsoft.com/上的源代码,看来所有源代码都在C#中.
我还查看了新的C#编译器平台(Roslyn)的源代码,它也在C#中.怎么可能?C#语言编译器是用C#编写的吗?还是我错过了一些明显的东西?如果C#编译器是用C#编写的,那么它是如何工作的?
我正在使用C#6.0测试Visual Studio 2015,但语言功能不起作用.在MVC Web应用程序中,以下代码编译:
if (!string.IsNullOrWhiteSpace(Model.Profile?.TypeName))
{
// More logic here...
}
Run Code Online (Sandbox Code Playgroud)
但是,当我通过Debug和IIS Express运行应用程序时,我收到以下错误:
CS1525:无效的表达式术语'.'
如何启用这些功能?
我正在编写一个返回JSON的代码的单元测试.它返回的类型是匿名类型,所以我想验证它上面的值我只是将对象转换为a dynamic
来做我的断言.
但是,当我这样做时,我的构建失败但我没有任何错误消息.我能够在新的单元测试项目中使用非常简单的代码重现这一点:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Run Code Online (Sandbox Code Playgroud)
请参阅下面的构建失败的屏幕截图
当我注释掉断言时,构建成功:
相比之下,我在LinqPad 5 beta(使用Roslyn编译器)中运行了以下代码并且没有任何问题:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Run Code Online (Sandbox Code Playgroud)
真正
这里发生了什么?由于错误没有显示我不能说,如果我用dynamic
,不正确,或者如果它不能找到使用过载IsTrue()
的,因为dynamic
,或者如果这是在编译器中的错误(虽然我很怀疑这个,我没有任何证据证明我的代码有问题).
关于过载问题,我试过Assert.IsTrue((bool)asDynamic.someValue);
但是构建仍然失败,仍然没有错误消息.
根据Per @ RonBeyer的评论,我也尝试过更多的演员,如下所示无济于事:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Run Code Online (Sandbox Code Playgroud)
经过仔细检查,我发现输出窗口中列出了一个错误:
c:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42):错误CS0656:缺少编译器所需的成员'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
好的,VS2013更善于报告错误,我会根据这些搜索:
好的,添加对Microsoft.CSharp的引用修复了构建错误,但我会将此问题保持打开状态,因为它可能是VS2015的一个问题(在我看来)应该解决.
我一直在研究Roslyn CTP,虽然它解决了与Expression树API类似的问题,但它们都是不可变的,但Roslyn以一种完全不同的方式这样做:
Expression
节点没有对父节点的引用,使用a进行修改ExpressionVisitor
,这就是为什么可以重用大部件的原因.
SyntaxNode
另一方面,Roslyn 有一个对其父级的引用,因此所有节点都有效地成为一个无法重用的块.类似的方法Update
,ReplaceNode
等等,提供了进行修改.
这到底在哪里?Document
?Project
?ISolution
?API促进树的逐步更改(而不是按钮向上),但每个步骤是否完整复制?
为什么他们这样做了?我有什么有趣的伎俩吗?
在C#6中,您可以使用nameof()
运算符来获取包含变量名称或类型的字符串.
这是在编译时评估,还是在运行时通过一些Roslyn API评估?
昨天在InfoWorld上关于新微软Roslyn的新闻稿中:
这种"解构"编译器最明显的优点是它允许从.Net应用程序内部调用整个编译执行过程.Hejlsberg演示了一个C#程序,它将一些代码片段作为字符串传递给C#编译器; 编译器将生成的IL汇编代码作为对象返回,然后将其传递到公共语言运行库(CLR)以供执行.瞧!使用Roslyn,C#获得了动态语言在运行时生成和调用代码的能力.
自从.NET 4发布以来,我已经能够做到这一点CSharpCodeProvider.CompileAssemblyFromSource
,实际上我在之前编写的一个ASP.Net项目中使用它实际上就是这样 - 允许用户在文本框中键入代码,选择程序集/名称空间引用,然后执行并显示该代码的输出,以便在Windows Azure上进行实时环境代码测试.
是CodeDom
Roslyn的一部分/前身吗?罗斯林的特殊好处是CodeDom
什么?
我想在我的项目中使用C#6(空传播,其他功能).
我在我的电脑上安装了VS 2015,它的工作非常出色并构建了测试代码
var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];
Run Code Online (Sandbox Code Playgroud)
但是当我将我的项目推送到repo并且CI开始构建它时,由于不支持,构建失败?
.
我已经在CI服务器上安装了VS2015,但是喜欢它不使用它.我能做什么?
CI - CruiseControl .NET构建 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
将项目从VS2013迁移到VS2015之后,项目不再构建.以下LINQ语句中发生编译错误:
static void Main(string[] args)
{
decimal a, b;
IEnumerable<dynamic> array = new string[] { "10", "20", "30" };
var result = (from v in array
where decimal.TryParse(v, out a) && decimal.TryParse("15", out b) && a <= b // Error here
orderby decimal.Parse(v)
select v).ToArray();
}
Run Code Online (Sandbox Code Playgroud)
编译器返回错误:
错误CS0165使用未分配的局部变量'b'
是什么导致这个问题?是否可以通过编译器设置来修复它?