【问题标题】:AppDomain.DoCallBack() with multi generic types issue具有多泛型类型问题的 AppDomain.DoCallBack()
【发布时间】: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 基础设施运行。这可能会导致错误。

标签: c# generics appdomain


【解决方案1】:

这是 .NET Remoting 基础架构中的一个错误。这是 .NET 内部代码中的崩溃。

我没有很好的解决方法。您可以使用表达式树编译非泛型包装函数。每组泛型类型参数都需要一个这样的 lambda。

【讨论】:

  • 任何线索为什么只有当 2 个通用参数相同时才会发生?
  • 我不明白这个错误。这只是一个解决方法。
  • @usr,请查看我的新评论
  • @brainwave 我添加了一些东西。试着让它以这种方式工作。
  • @usr,无法编译这个..关于 CrossAppDomaiDelegate 的一些东西有错误的参数..因为 DoCallBack 需要一个 CrossAppDomaiDelegate
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多