{"无法加载文件或程序集'AssemblyName,PublicKeyToken = null'或其依赖项之一.找到的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)":"AssemblyName,PublicKeyToken = null"}
我正在InnerException.Message尝试在签署正在使用的未签名第三方程序集之后调试我的应用程序时收到有问题的消息.奇怪的是,我已经签署了消息中显示的程序集,即无法加载的程序集.
这可能是什么问题?我该如何解决这个问题?
编辑
编辑以提供有关我所做的更多信息:
抛出异常的程序集,顺便说一下,项目构建正常,这是我正在构建的程序集的运行时异常InitializeComponent(),是一个带有WPF控件的开源组件(MahApps.Metro).我发现了一个类似的问题,但没有一个答案解决了这个问题.
与3.5相比,.NET 4.0中是否有新的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) 由于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代码的编译器.重要的是,由Mono和Microsoft .NET JIT编译器对生成的IL进行JIT,以获得最快的机器代码.
我的问题是:
优化模式是否有意义:
'stloc.0; ldloc.0; ret' => 'ret'
'ldc.i4.0; conv.r8' => 'ldc.r8.0'
Run Code Online (Sandbox Code Playgroud)
等等,或JIT是否足够聪明,可以照顾这些?
是否有Microsoft/Mono JIT编译器执行的优化列表的规范?
是否有任何良好的读物与实际建议/最佳实践来优化IL,以便JIT编译器可以反过来生成最佳的机器代码(性能方面)?
我很好奇是否有一种方法this可以在C#中的虚方法中为null.我认为这是不可能的.我在现有代码中看到,在代码审查期间,我希望100%肯定对其删除进行评论,但我想要一些确认和社区的更多上下文.this != null在任何非静态/实例方法中都是这种情况吗?否则它会是一个空指针异常对吗?我正在考虑扩展方法以及我可能不熟悉多年Java的C#特性.
更新
一年后,我终于意识到了这种行为的原因.本质上,一个对象不能被拆箱到不同的类型(即使该类型转换或转换为目标类型),如果你不知道正确的类型,你必须以某种方式发现它.赋值可能完全有效,但这不可能自动发生.例如,即使一个字节适合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#中有以下示例代码:
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) 鉴于这两种方法:
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?