Tag: roslyn

params超载明显模糊 – 仍然编译和工作?

我们在代码中找到了这些: public static class ObjectContextExtensions { public static T Find(this ObjectSet set, int id, params Expression<Func>[] includes) where T : class { … } public static T Find(this ObjectSet set, int id, params string[] includes) where T : class { … } } 如您所见,除了params之外,它们具有相同的特征。 它们被用于多种方式,其中之一: DBContext.Users.Find(userid.Value); //userid being an int? (Nullable) 对我来说奇怪的是,它解决了第一次超载。 Q1:为什么这不会产生编译错误? Q2:为什么C#编译器解析了上面第一个方法的调用? 编辑 […]

使用Roslyn编译时编译源代码

在CI服务器上的MSBuild任务中使用Roslyn编译之前是否可以修改源代码? 我已经成功地做了我想要的VS但是我想知道它是否可能在VS之外。 目前我正在研究Workspace API和编译器API,它们似乎是实现这一目标的正确工具,但我仍然不确定它是否可行? 特别是我担心返回我对MSBuild所做的更改以允许它继续工作。

使用Roslyn在引用的程序集中获取接口实现

我想在我正在开发的框架中绕过一些经典的汇编扫描技术。 所以,说我已经定义了以下合同: public interface IModule { } 这存在于Contracts.dll 。 现在,如果我想发现这个接口的所有实现,我们可能会做类似于以下的事情: public IEnumerable DiscoverModules() { var contractType = typeof(IModule); var assemblies = AppDomain.Current.GetAssemblies() // Bad but will do var types = assemblies .SelectMany(a => a.GetExportedTypes) .Where(t => contractType.IsAssignableFrom(t)) .ToList(); return types.Select(t => Activator.CreateInstance(t)); } 不是一个很好的例子,但它会做。 现在,这些类型的汇编扫描技术可能完全不足,而且它们都在运行时完成,通常会影响启动性能。 在新的DNX环境中,我们可以使用ICompileModule实例作为元编程工具,因此您可以将ICompileModule的实现ICompileModule到项目的Compiler\Preprocess文件夹中,并让它做一些时髦的事情。 我的目标是使用ICompileModule实现,以便在编译时执行我们在运行时所做的工作。 在我的引用(包括编译和程序集)和我当前的编译中,发现所有可以实现的IModule实例 创建一个类,让我们称之为ModuleList ,其实现产生每个模块的实例。 public static class ModuleList { […]

将Roslyn编译的程序集加载到沙箱AppDomain中

我有一个代码片段,用脚本引擎编译脚本,我将程序集作为字节数组进行检索。 现在我想在Sandbox中加载这个Assembly ,这就是我所拥有的: Assembly _dynamicAssembly; ScriptEngine _engine; Session _session; public string Execute(string code) { // Setup sandbox var e = new Evidence(); e.AddHostEvidence(new Zone(SecurityZone.Internet)); var ps = SecurityManager.GetStandardSandbox(e); var setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory }; var domain = AppDomain.CreateDomain(“Sandbox”, AppDomain.CurrentDomain.Evidence, setup, ps); AppDomain.CurrentDomain.AssemblyResolve += DomainAssemblyResolve; // Process code var submission = _engine.CompileSubmission(code, […]

用Roslyn获取’var’的类型?

我有一个名为’test.cs’的.cs文件,基本上看起来像: namespace test { public class TestClass { public void Hello() { var x = 1; } } } 我试图用Roslyn解析它并得到x的类型,它应该是’int’,但我只能发现它是’var’类型,我似乎无法获得实际的底层类型。 这基本上就是我现在的代码 var location = “test.cs”; var sourceTree = CSharpSyntaxTree.ParseFile(location); var root = (CompilationUnitSyntax)sourceTree.GetRoot(); foreach (var member in root.Members) { //…get to a method var method = (MethodDeclarationSyntax())member; foreach (var child in method.Body.ChildNodes()) { if (child […]

为什么Roslyn中有如此多的对象池实现?

ObjectPool是Roslyn C#编译器中使用的一种类型,用于重用经常使用的对象,这些对象通常会被新用起来并经常收集垃圾。 这减少了必须发生的垃圾收集操作的数量和大小。 Roslyn编译器似乎有几个单独的对象池,每个池有不同的大小。 我想知道为什么有这么多的实现,首选的实现是什么,以及为什么他们选择了20,100或128的池大小。 1 – SharedPools – 如果使用BigDefault,则存储20个对象的池或100个。 这个也很奇怪,因为它创建了一个新的PooledObject实例,当我们试图聚集对象而不是创建和销毁新对象时这没有任何意义。 // Example 1 – In a using statement, so the object gets freed at the end. using (PooledObject pooledObject = SharedPools.Default<List>().GetPooledObject()) { // Do something with pooledObject.Object } // Example 2 – No using statement so you need to be sure no exceptions are […]

Roslyn分析器代码修复 – 禁用预览选项

如何禁用C#项目中灯泡后显示的预览对话框? 我遇到的问题是,RegisterCodeFixesAsync调用数据库并递增id,这是两次完成(一次是在预览期间,第二次是在调用动作时),而不是仅增加一次,id增加两次

从cs文件加载脚本并访问主机方法,属性等?

我只是和罗斯林玩,但不确定如何做以下事情。 为了保持这个简单,让我说我有一个主机程序,它有一个像这样的方法 public void DisplayMessage(string message) { MessageBox.Show(message); } 然后,我可以有一个名为MyScript.csx的脚本文件,然后在脚本中的某个地方有类似的东西 void Main() { Host.DisplayMessage(“I am a script”); } 然后我让主机加载文件并执行它。 如果不能做这种事情,是否有基于c#的脚本系统/引擎可以做到这一点? 这些是要求 主机应用程序可以从文件加载脚本。 脚本文件是用c#编写的,因此可以使用带语法等的VS2010编写 脚本文件可以访问主机公共方法,属性等

使用Roslyn创建一个Func

受到本文和本文的启发,我正在尝试使用Roslyn创建一个动态函数。 然而,上述来源已过时或未完成,我无法创建function样本。 到目前为止我的工作: var code = @”Func doStuffToInt = i => { var result = i; for (var y = i; y <= i * 2; y++) { result += y; } return result; };"; var se = new ScriptEngine(); var session = se.CreateSession(); session.AddReference(typeof(Program).Assembly); session.AddReference(typeof(Expression).Assembly); session.ImportNamespace("System"); session.ImportNamespace("System.Linq"); session.ImportNamespace("System.Linq.Expressions"); var submission = session.CompileSubmission<Func>(code); Func myFunc […]

EventSourceException:操作系统中没有可用的免费缓冲区

完整的例外文本是: EventSourceException:操作系统没有可用的免费缓冲区(例如事件速率太快)。 由于递归,我称这种方法大约一百万次。 它不会停止,我只是在VS2013的Output Debug windown中获取exception文本。 但它超级慢。 private static IEnumerable RecursiveFindServices(ISymbol sym, Solution sln) { List list = new List(); var callers = SymbolFinder.FindCallersAsync(sym, sln).Result; // this line may cause the EventSourceException (try not to call Async) foreach(var caller in callers) { string name = GetMethodName(caller); if (caller.CallingSymbol.ContainingType.Name.EndsWith(“Test”)) continue; if (recursiveList.Contains(name)) continue; recursiveList.Add(name); if (IsWebservice(caller)) […]