标签: il

Visual Studio/RAD支持直接在IL中编码?

在最长的时间里,我一直很想直接在中级语言中编写代码作为学术努力,以便更好地理解"引擎盖下"正在发生的事情.

是否有人以以下形式为*IL提供Visual Studio支持:项目模板,IntelliSense和RAD工具集成?

编辑:我不是说限制在开箱即用的功能.例如,我可以下载Visual Studio扩展以支持Python,COBOL等.为*IL寻找相同的内容.

有一个独立的中间汇编程序工具,因此编码和编译它的能力已经存在于Visual Studio之外.

intellisense il cil visual-studio

14
推荐指数
1
解决办法
1218
查看次数

无法加载文件或程序集"AssemblyName PublicKeyToken = null"或其依赖项之一

{"无法加载文件或程序集'AssemblyName,PublicKeyToken = null'或其依赖项之一.找到的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)":"AssemblyName,PublicKeyToken = null"}

我正在InnerException.Message尝试在签署正在使用的未签名第三方程序集之后调试我的应用程序时收到有问题的消息.奇怪的是,我已经签署了消息中显示的程序集,即无法加载的程序集.

这可能是什么问题?我该如何解决这个问题?

编辑

编辑以提供有关我所做的更多信息:

  • 签署了我的项目引用的所有未签名的第三方程序集.
  • 反汇编这些程序集以查看它们是否在内部引用任何外部未签名程序集(它们没有)
  • 从项目的引用列表中删除旧的未签名的程序集,并重新添加新签名的程序集.
  • 通过添加程序集引用中缺少的PublicKeyToken,卸载项目并编辑无法加载到.sln XML样式文件中的程序集的引用.

抛出异常的程序集,顺便说一下,项目构建正常,这是我正在构建的程序集的运行时异常InitializeComponent(),是一个带有WPF控件的开源组件(MahApps.Metro).我发现了一个类似的问题,但没有一个答案解决了这个问题.

如何强制WPF使用使用程序集强名称的资源URI?哎呀!

.net il strongname manifest disassembly

14
推荐指数
1
解决办法
4万
查看次数

在CLR 4.0中引入了哪些OpCodes?

与3.5相比,.NET 4.0中是否有新的IL操作码,如果有的话,我在哪里可以找到它们的列表?

.net clr il cil opcode

13
推荐指数
1
解决办法
751
查看次数

当我使用is运算符时为什么在IL代码中只有空值检查?

我想知道如何is operator实现C#.我已经编写了一个简单的测试程序(没有什么特别的,仅用于演示目的):

class Base
{
    public void Display() {  Console.WriteLine("Base"); }
}

class Derived : Base { }

class Program
{
    static void Main(string[] args)
    {
        var d = new Derived();

        if (d is Base)
        {
            var b = (Base) d;
            d.Display();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并查看生成的IL代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       27 (0x1b)
  .maxstack  2
  .locals init ([0] class ConsoleApplication1.Derived d,
           [1] bool V_1,
           [2] …
Run Code Online (Sandbox Code Playgroud)

c# il

13
推荐指数
2
解决办法
690
查看次数

为什么LambdaExpression.Compile()适用于iOS(Xamarin)?

由于Xamarin.iOS在运行时不支持代码生成,为什么Compile()和DynamicInvoke()按预期工作?

例如,以下代码工作正常:

var lambda = Expression.Lambda(
                          Expression.Add(
                              Expression.Constant(1),
                              Expression.Constant(2)
                          )
             );

var f = lambda.Compile();
var result = f.DynamicInvoke();

// result==3 at this point
Run Code Online (Sandbox Code Playgroud)

Xamarin是否在运行时评估表达式树而不是发出IL代码?

il ios xamarin

13
推荐指数
1
解决办法
1388
查看次数

JIT编译器的IL优化

我正在开发一个发出IL代码的编译器.重要的是,由Mono和Microsoft .NET JIT编译器对生成的IL进行JIT,以获得最快的机器代码.

我的问题是:

  1. 优化模式是否有意义:

    'stloc.0; ldloc.0; ret' => 'ret' 
    'ldc.i4.0; conv.r8' => 'ldc.r8.0'
    
    Run Code Online (Sandbox Code Playgroud)

    等等,或JIT是否足够聪明,可以照顾这些?

  2. 是否有Microsoft/Mono JIT编译器执行的优化列表的规范?

  3. 是否有任何良好的读物与实际建议/最佳实践来优化IL,以便JIT编译器可以反过来生成最佳的机器代码(性能方面)?

.net c# il jit

13
推荐指数
2
解决办法
446
查看次数

在C#虚拟方法中,"this"可以为null吗?其他实例方法会发生什么?

我很好奇是否有一种方法this可以在C#中的虚方法中为null.我认为这是不可能的.我在现有代码中看到,在代码审查期间,我希望100%肯定对其删除进行评论,但我想要一些确认和社区的更多上下文.this != null在任何非静态/实例方法中都是这种情况吗?否则它会是一个空指针异常对吗?我正在考虑扩展方法以及我可能不熟悉多年Java的C#特性.

c# il this c#-4.0

13
推荐指数
3
解决办法
1728
查看次数

动态生成IL中的值类型转换

更新
一年后,我终于意识到了这种行为的原因.本质上,一个对象不能被拆箱到不同的类型(即使该类型转换或转换为目标类型),如果你不知道正确的类型,你必须以某种方式发现它.赋值可能完全有效,但这不可能自动发生.

例如,即使一个字节适合Int64,也不能将一个字节拆分为long.您必须将一个字节取消装箱作为一个字节,然后再将其转换.

如果您没有足够的信息来执行此操作,则必须使用其他方法(如下所示).

表征和身份

原始问题

我正在与IL合作,以提高通常用反射处理的许多任务的性能.为了实现这一点,我正在大量使用这门DynamicMethod课程.

我编写了动态方法来设置对象的属性.这允许开发人员仅基于名称动态设置属性.这适用于将数据库中的记录加载到业务对象等任务.

但是,我坚持一个(可能很简单)的事情:将值类型转换为更小的类型(例如将字节的值放入Int32).

这是我用来创建动态属性设置器的方法.请注意,我删除了除IL生成部分之外的所有内容.

 // An "Entity" is simply a base class for objects which use these dynamic methods.
 // Thus, this dynamic method takes an Entity as an argument and an object value
 DynamicMethod method = new DynamicMethod( string.Empty, null, new Type[] { typeof( Entity ), typeof( object ) } );

ILGenerator il = method.GetILGenerator();    
PropertyInfo pi = entityType.GetProperty( propertyName );
MethodInfo mi = pi.GetSetMethod();

il.Emit( OpCodes.Ldarg_0 ); // push entity …
Run Code Online (Sandbox Code Playgroud)

c# il type-conversion

12
推荐指数
1
解决办法
3293
查看次数

为什么C#编译器会生成方法调用以在IL中调用BaseClass方法

让我们说我们在C#中有以下示例代码:

class BaseClass
  {
    public virtual void HelloWorld()
    {
      Console.WriteLine("Hello Tarik");
    }
  }

  class DerivedClass : BaseClass
  {
    public override void HelloWorld()
    {
      base.HelloWorld();
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      DerivedClass derived = new DerivedClass();
      derived.HelloWorld();
    }
  }
Run Code Online (Sandbox Code Playgroud)

当我ildasmed以下代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       15 (0xf)
  .maxstack  1
  .locals init ([0] class EnumReflection.DerivedClass derived)
  IL_0000:  nop
  IL_0001:  newobj     instance void EnumReflection.DerivedClass::.ctor()
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  callvirt …
Run Code Online (Sandbox Code Playgroud)

.net c# il

12
推荐指数
2
解决办法
692
查看次数

在新的c#6"的情况下调用而不是callvirt?" 空检查

鉴于这两种方法:

    static void M1(Person p)
    {
        if (p != null)
        {
            var p1 = p.Name;
        }
    }

    static void M2(Person p)
    {
        var p1 = p?.Name;
    }
Run Code Online (Sandbox Code Playgroud)

为什么M1 IL代码使用callvirt:

IL_0007:  brfalse.s  IL_0012
IL_0009:  nop
IL_000a:  ldarg.0
IL_000b:  callvirt   instance string ConsoleApplication4.Person::get_Name()
Run Code Online (Sandbox Code Playgroud)

和M2 IL使用call:

brtrue.s   IL_0007
IL_0004:  ldnull
IL_0005:  br.s       IL_000d
IL_0007:  ldarg.0
IL_0008:  call       instance string ConsoleApplication4.Person::get_Name()
Run Code Online (Sandbox Code Playgroud)

我只能猜到它,因为在M2我们知道它p不是空的,它就像它

new MyClass().MyMethod();
Run Code Online (Sandbox Code Playgroud)

这是真的吗?

如果是,如果p在其他线程中将为null?

c# clr il roslyn c#-6.0

12
推荐指数
2
解决办法
588
查看次数