C# 跨不同的程序集版本传递类对象

C# 跨不同的程序集版本传递类对象,c#,reflection,assemblies,reflection.emit,reflector,C#,Reflection,Assemblies,Reflection.emit,Reflector,情况是这样的- 我有一个集会说“我的集会”。此程序集中定义了一个接口,称为“IMyInterface” 在同一个程序集中,我有一个类(MyClass),其中有一个方法定义为: 公共void MyMethod(IMyInterface对象){} 现在在我的项目中,我已经创建了一个接口,其名称和属性与“MyAssembly”中的接口“IMyInterface”所公开的名称和属性相同 我有一个类扩展了这个接口(我在项目中创建的接口),我想使用反射将该类的对象作为参数传递给不同程序集中的方法“My

情况是这样的-

  • 我有一个集会说“我的集会”。此程序集中定义了一个接口,称为“IMyInterface”
  • 在同一个程序集中,我有一个类(MyClass),其中有一个方法定义为:
公共void MyMethod(IMyInterface对象){}

  • 现在在我的项目中,我已经创建了一个接口,其名称和属性与“MyAssembly”中的接口“IMyInterface”所公开的名称和属性相同
  • 我有一个类扩展了这个接口(我在项目中创建的接口),我想使用反射将该类的对象作为参数传递给不同程序集中的方法“MyMethod”
问题是-

  • 当我尝试使用反射调用该方法时,出现了一个异常,“无法将对象转换为IMyInterface类型”
代码-

如果我没有弄错,这是因为创建的对象在不同的程序集中,并且该方法所需的参数是它自己的程序集

我想到的另一种方法是在类中创建我自己的动态方法,它将接受我的类的对象

我曾尝试通过谷歌搜索反射。Emit或RunSharp动态创建自己的类。但是,我们只能在动态生成的程序集中使用它,而不能在已经存在的程序集中创建动态方法或类

我知道在运行时生成程序集不是一个好方法。但我现在想不出什么了。谢谢您的帮助。

这里:

现在在我的项目中,我已经创建了一个接口,其名称和属性与“MyAssembly”中的接口“IMyInterface”所公开的名称和属性相同

问题就在这里,;仅声明一个类似命名的接口是不够的。类型的范围由其程序集决定;也就是说,对于CLR,是一个完全不同的接口


相反,将引用添加到原始程序集,并实现已定义的接口。应该只定义一次。

如果我正确理解了您的问题,我相信您希望在自己的程序集中定义接口,然后从其他两个程序集中引用公共接口程序集。这样,每个程序集都引用相同的接口定义:

创建并构建MyInterfaces dll:

namespace MyInterfaces
{
    public interface IMyInterface
    {
        void SharedMethod();
    }
}
然后在不同的项目中创建第一个程序集,并设置对为MyInterface创建的dll的引用。创建类,注意模块顶部的“使用”语句:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyInterfaces;

namespace MyFirstProject
{
    public class MyClass1
    {
        public void MyMethod(IMyInterface SomeObject) { }
    }
}

现在,我相信您的动态对象创建应该可以工作了,因为两个对象都实现了“MyInterfaces”中定义的相同接口。

您正在与一种称为“类型标识”的东西作斗争,这是.NET framework中一种非常重要的DLL地狱对策。类型不仅由其名称空间名称和类型名称标识,还包括它来自的程序集的属性。特别是程序集显示名称、[AssemblyVersion]、[AssemblyCulture]、PublicKeyToken和(间接)ProcessorArchitecture。您可以使用type.AssemblyQualifiedName属性查看“real”类型名称。例如,System.String类是
System.String、mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089

这将阻止您在另一个程序集中伪造类型,除非您可以为该程序集提供完全相同的属性。更简单的方法是简单地使用现有的程序集,在您的情况下应该没有问题,因为您只使用一个接口


值得注意的是,这个要求在.NET4中有所放宽。如果名称和[Guid]匹配,则从COM类型库自动生成的类型是等效的。这有助于消除PIA并实现“嵌入互操作类型”功能。没有适用于您的情况。

我无法添加对组件的引用,因为我需要根据某些用例在运行时加载程序集..:(>简单地使用现有程序集要容易得多,在您的情况下应该没有问题,因为您只使用接口。但是我想要我自己的实现(接口的实现方式)并希望传递该对象。但由于该实现已部署,因此无法在现有程序集中使用。无法修改该程序集:(这就是为什么我试图在较新版本的汇编中实现它,并通过反射将其作为参数传递。如果您能提供帮助,我可以通过其他方式实现吗..谢谢...)我不明白为什么这是一个问题,只需使用已部署程序集的副本并将其添加为对项目的引用。不需要反射黑客。我无法添加对assmebly的引用,因为我需要根据某些用例在运行时加载程序集。我必须根据某些用户场景加载程序集(它已经可以这样工作了,只有当您执行使用来自程序集的类型的代码时,才会加载程序集。不需要反射黑客。抱歉,无法加载。我如何将接口的实现注入到其他程序集中?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyInterfaces;

namespace MyFirstProject
{
    public class MyClass1
    {
        public void MyMethod(IMyInterface SomeObject) { }
    }
}