【发布时间】:2015-02-15 11:33:00
【问题描述】:
我对 AppDomain.DoCallBack() 和泛型类型有一个奇怪的问题:
static void InvokeIsolated() {
AppDomain appDomain = AppDomain.CreateDomain("testDomain");
appDomain.DoCallBack(MyDoCallBack<string, string>); <-- ArgumentNullException!
}
static void MyDoCallBack<T, T1>() {}
我得到一个参数 nullexpcetion 的消息:“值不能为空” 当泛型类型相同时。
如果我将 docallback 更改为此:
appDomain.DoCallBack(MyDoCallBack<string, int>); <-- OK!
这意味着如果泛型类型不同,则没有问题。
出了什么问题或者这是一个 .net 错误??
更新: 如果使用泛型类型调用,lambda 不是一种解决方法:
static void Foo()
{
InvokeIsolated<string, string>();
}
static void InvokeIsolated<T, T1>()
{
AppDomain appDomain = AppDomain.CreateDomain("testDomain");
appDomain.DoCallBack(() => MyDoCallBack<T, T1>()); //<--ArgumentNullException
}
static void MyDoCallBack<T, T1>() {}
【问题讨论】:
-
你从哪里得到
ArgumentNullException? -
为了帮助您,我们需要 DoCallBack 的代码
() -
我在 appDomain.DoCallBack(DoCallBack
) 上得到 ArgumentNullException; -
DoCallBack 为空..
-
我可以复制这个。这是 C# 编译器或 JIT 中的错误。有一个
qword ptr [rax]并且rax的内存似乎未映射,因为VS 内存窗口无法显示它。更新:IL 很好,所以它是一个 JIT 错误。DoCallBack只是根据 Reflector 调用它的参数。所以它似乎得到了特殊的 JIT 处理或通过 Remoting 基础设施运行。这可能会导致错误。