2

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

错误:

[A]MyClass 不能转换为 [B]MyClass。类型 A 源自 'MyExe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在位置 'C:\MyPath\MyExe.exe' 的上下文 'Default' 中。类型 B 源自 'MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在位置 'C:\MyPath\MyDLL.dll' 的上下文 'LoadNeither' 中。

执行代码:

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;
}
4

1 回答 1

3

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

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

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

于 2013-03-14T14:53:22.013 回答