Ron*_*nny 4 .net c# generics .net-micro-framework
我正在与合作伙伴合作,我们正在尝试将复杂的驱动程序从.NET平台迁移到.NET MicroFramework.
问题是.NET MF不支持泛型,当我们尝试构建应用程序时,最后一个"链接"操作以错误代码"CLR_E_PARSER_UNSUPPORTED_GENERICS"退出.但是没有关于WHERE(模块,代码行)的信息.
据我们所知,没有人故意插入泛型,他们一直在查看代码,以确定问题是什么,没有运气.
所以我的问题是:是否有某种方法可以在VS2010中关闭对泛型的支持,以便编译器标记有问题的行?
Eri*_*ert 18
有没有办法在VS2010中关闭对泛型的支持,以便编译器标记有问题的行?
是的,但它是一个"核"选项:
using System.Collections.Generic;
class Test
{
    static void Main()
    {
        IEnumerable<int> x = null;
    }
}
C:\> csc /langversion:ISO-1 \foo.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
c:\foo.cs(9,12): error CS1644: Feature 'generics' cannot be used because it is
        not part of the ISO-1 C# language specification
ISO-1开关关闭了C#1.0中没有的所有功能,这些功能可能比您想要关闭的功能更多.
请注意,该开关不是"在C#2.0编译器中模拟C#1.0"开关; 如果你想运行C#1.0编译器,只需运行它.该开关旨在识别特定版本中不存在的功能并禁止它们.
请注意,交换机也可能无法执行您需要执行的所有操作.它只是禁止使用通用语法.如果您使用泛型类型而不实际使用通用语法,则交换机不会捕获它.
没有这种特定的编译器开关.
您可以查看源代码(或反编译的源代码)并搜索泛型的用法.泛型可以在项目中声明,也可以由项目使用泛型构造(类,方法,变量......).
您可能希望使用反射来查找程序集中的泛型声明(类,方法,字段,但不是变量).要查找泛型的用法,您还需要查看IL指令.像Mono.Cecil这样的图书馆可以帮助你解决这个问题.
UPDATE
事实证明(当然,Eric Lippert帮助)你可以用这个开关编译C#1.0规范的代码:
除了仿制药,你也会错过一些添加至该事情C#2.0和更高版本.
示例代码
使用Mono.Cecil,您可以加载程序集并获取其所有类型:
using Mono.Cecil;
using Mono.Cecil.Rocks;
...
var asm = AssemblyDefinition.ReadAssembly("MyAssembly.dll");
var types = asm.MainModule.GetAllTypes();
然后开始对他们进行有趣的查询:
var genericTypes = types.Where(type => type.HasGenericParameters);
var genericMethods = types.
  Select(type => 
    type.Methods.Where(method => method.HasGenericParameters));
var genericFields = types.
  Select(type => 
    type.Fields.Where(field => field.DeclaringType.HasGenericParameters));
var genericMethodInstructions = types.Select(type =>
  type.Methods.Where(method => method.HasBody).
  Select(method => method.Body.Instructions.
    Where(instruction => instruction.Operand is MethodReference).
    Select(instruction => (MethodReference)instruction.Operand).
    Where(methodRef => methodRef.Resolve().HasGenericParameters)));