【问题标题】:InvalidCastException, wrong context?InvalidCastException,错误的上下文?
【发布时间】:2013-03-02 23:53:43
【问题描述】:

我有一个执行数据转储的 exe。 exe 将根据配置动态获取 DLL,并将类对象传递给它。 DLL 有一个用它编译的这个类的副本,并且可以在调试下看到数据,作为对象没有问题。但是,当我尝试将其投射到课堂上时,它告诉我它不能因为上下文。我确信我有时会忽略一些事情。

错误:

[A]MyClass 不能转换为 [B]MyClass。 A型起源于 'MyExe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 位置“C:\MyPath\MyExe.exe”的上下文“默认”。 B型起源 来自“MyDLL,版本=1.0.0.0,文化=中性,PublicKeyToken=null” 位置“C:\MyPath\MyDLL.dll”的上下文“LoadNeither”。

EXE 代码:

Object[] param = new Object[] { MyClass };
MethodInfo m = type.GetMethod("MyMethod");
reader = (SqlDataReader)m.Invoke(obj, param);

DLL 代码:

public SqlDataReader MyMethod(Object param)
{
    SqlDataReader reader = new SqlDataReader();
    Type t = param.GetType();  //Returns MyClass

    if (param is MyClass)      //Returns false
        reportItem = (MyClass)param; //Never executes

    MyClass reportItem = (MyClass)param; //InvalidCastException

    //other code here, pulling data
    return reader;
}

【问题讨论】:

  • 我的猜测是您必须动态创建作为参数传入的类对象。或者在 MyMethod 中,使用传入对象的属性创建一个新的 MyClass。

标签: c# dll


【解决方案1】:

DLL 有一个用它编译的这个类的副本

基本上不要那样做。您应该有 one 程序集中的类型,并且只有一个程序集。就 CLR 而言,它们是完全不同的类型。

您可能希望拥有一个插件和应用程序都可以引用的通用库。或者您可以让您的插件引用应用程序可执行文件并将类型保留在其中。

【讨论】:

  • 我在两者之间有共同的对象,但它们专门用于 SQL 或 Logging。我将创建另一个并尝试一下。谢谢。
猜你喜欢
  • 2011-01-06
  • 2012-03-04
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多