Tag: compiler construction

在运行时编译代码,加载到当前appdomain但Type.GetType无法看到它

我在运行时编译一些代码,然后将程序集加载到当前的appdomain,但是当我尝试做Type.GetType时,它无法找到类型… 以下是我编译代码的方法…… public static Assembly CompileCode(string code) { Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(); ICodeCompiler compiler = provider.CreateCompiler(); CompilerParameters compilerparams = new CompilerParameters(); compilerparams.GenerateExecutable = false; compilerparams.GenerateInMemory = false; foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { string location = assembly.Location; if (!String.IsNullOrEmpty(location)) { compilerparams.ReferencedAssemblies.Add(location); } } catch (NotSupportedException) { // this happens for dynamic assemblies, […]

MS C#编译器和非优化代码

注意:我发现我发布的示例中有一些错误 – 编辑修复它 如果你不启用优化,官方的C#编译器会做一些有趣的事情。 例如,一个简单的if语句: int x; // … // if (x == 10) // do something 如果优化,会变成以下内容: ldloc.0 ldc.i4.s 10 ceq bne.un.s do_not_do_something // do something do_not_do_something: 但如果我们禁用优化,它会变成这样: ldloc.0 ldc.i4.s 10 ceq ldc.i4.0 ceq stloc.1 ldloc.1 brtrue.s do_not_do_something // do something do_not_do_something: 我无法理解这一点。 为什么所有额外的代码,似乎在源中不存在? 在C#中,这相当于: int x, y; // … // y = x […]

为什么我没有收到关于未初始化的只读字段的警告?

如果您忘记初始化私有或内部的只读成员,或者声明它的类是内部的,那么C#编译器就足以为您提供“永远不会分配字段”警告。 但是,如果该类是公开的,并且只读成员是公共的,受保护的或内部保护的,那么就没有警告! 有谁知道为什么? 示例代码,用于说明发出警告的条件以及未发出警告的条件: namespace Test1 { class Test1 { #if TRY_IT public readonly int m; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 protected readonly int n; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 internal readonly int […]

使用默认参数重载的构造函数

我不小心在C#中重载了一个构造函数,如下所示: public MyClass(string myString) { // Some code goes here } public MyClass(string myString, bool myParameter = false) { // Some different code here } 使用此代码,我的项目编译得很好。 如果我用一个string参数调用构造函数,C#如何决定我想使用哪个构造函数? 为什么语法允许这个function?

如何在通过命令行编译c#代码时使用引用

谁能帮助我通过命令行编译一些c#文件? 我有4个要编译的文件,Main,Form1(使用2.cs文件)和项目中使用的另一个类。 我想在命令行中编译这个项目,所以我可以添加/ t:library开关(就像在本教程中一样: http : //dotnetslackers.com/articles/csharp/WritingAnActiveXControlInCSharp.aspx )。 但是在使用“csc / t:library Program1.cs MainForm.cs MainForm.Designer.cs EigenObjectRecognizer.cs”后,我得到了缺少的程序集引用错误,如下所示: \Project\FaceRecProOVaspVer\FaceRecProOV\MainForm.cs(14,15): error CS0234: The type or namespace name ‘Structure’ does not exist in the namespace ‘Emgu.CV’ (are you missing an assembly reference?) 我确实安装了EMGU二进制文件。 我想我需要使用像EMGU.CV.dll这样的文件夹中的一些.dll?

构建一个简单的解释器

我正在开始一个项目,我需要实现一个轻量级的解释器。 解释器用于执行简单的科学算法。 此解释器将使用的编程语言应该很简单,因为它针对的是非软件开发人员(例如,数学家)。 解释器应该支持基本的编程语言function: 实数,变量,多维数组 二进制(+, – ,*,/,%)和布尔(==,!=,, =)操作 循环(for,while),条件表达式(if) function MathWorks MatLab是我前进的一个很好的例子,更简单。 解释器将用作演示算法的环境; 简单的算法,如查找数据集/数组的平均值,或稍微复杂的算法,如高斯消元法或RSA 。 我在这个主题上发现的最佳/最实用的资源是Ron Ayoub在Code Project上的条目( 使用解释器模式解析代数表达式 ) – 这是我问题的缩小版本的完美示例。 紫龙书似乎太多了,更实用了吗? 解释器将使用C#实现为.NET库。 但是,欢迎任何平台的资源,因为这个问题的设计架构部分是最具挑战性的。 任何实用资源? (请避免“这不是微不足道的”或“为什么要重新发明轮子”的回应)

静态字段初始化如何在C#中工作?

是否应该在调用构造函数之前完成静态字段初始化? 以下程序提供的输出似乎对我不正确。 new A() _A == null static A() new A() _A == A 代码: public class A { public static string _A = (new A()).I(); public A() { Console.WriteLine(“new A()”); if (_A == null) Console.WriteLine(“_A == null”); else Console.WriteLine(“_A == ” + _A); } static A() { Console.WriteLine(“static A()”); } public string I() { […]

.NET编译器和“并非所有代码路径返回值”

为什么在如下代码中.NET编译器无法确定所有代码路径都返回值? bool Test(bool param) { bool test = true; if (param) test = false; else test = false; if (!test) return false; } 错误CS0161:并非所有代码路径都返回值! 代码可以重构 – 但编译器不建议这样做。 然而,所有返回路径都被覆盖 – 那么为什么编译器会抱怨它们不是? 编辑:我想这里的结论是: (error CS0161) + (all code paths obviously return a value) => refactor code. 一旦你养成了翻译的习惯,我猜一切都还可以。

内联属性初始化和尾随逗号

void Main() { Test t = new Test { A = “a”, B = “b”, // <– erroneous trailing comma }; } public class Test { public string A { get; set; } public string B { get; set; } } 我在代码中发现了上述错字很多。 我总是很惊讶编译器似乎并不关心这一点。 为什么以上不是语法错误? 它真的有用吗?

奇怪的(可能是错的?)C#编译器行为与方法重载和枚举

今天我发现了一个非常奇怪的C#函数重载行为。 当我有一个方法有2个重载,一个接受对象,另一个接受任何类型的枚举时,会出现问题。 当我将0作为参数传递时,将调用该方法的Enum版本。 当我使用任何其他整数值时,将调用Object版本。 我知道这可以通过使用显式转换来轻松修复,但我想知道为什么编译器会以这种方式运行。 这是一个错误还是我不知道的一些奇怪的语言规则? 下面的代码解释了问题(使用运行时2.0.50727检查) 感谢您对此的任何帮助,Grzegorz Kyc class Program { enum Bar { Value1, Value2, Value3 } static void Main(string[] args) { Foo(0); Foo(1); Console.ReadLine(); } static void Foo(object a) { Console.WriteLine(“object”); } static void Foo(Bar a) { Console.WriteLine(“enum”); } }