gpt4 book ai didi

c# - 跨不同程序集版本传递类对象

转载 作者:行者123 更新时间:2023-11-30 14:01:11 25 4
gpt4 key购买 nike

场景是这样的-

  • 我有一个程序集说“MyAssembly”。此程序集中定义了一个名为“IMyInterface”的接口(interface)。
  • 在同一个程序集中,我有一个类 (MyClass),其中的方法定义为:

public void MyMethod( IMyInterface object ) { }

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

问题是 -

  • 当我尝试使用反射调用该方法时,我遇到了这样的异常:“无法将对象转换为 IMyInterface 类型”

代码 -

Assembly myAssembly = Assembly.LoadFrom("MyAssembly");
object classObject = myAssembly.CreateInstance("MyClass");
Type classType = myAssembly.GetType("MyClass");
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance);

// Creating an object of class in the latest assembly and need to pass this
// to method in assembly with different version.
ClassExtendingMyInterface obj= new ClassExtendingMyInterface ();

myMethod.Invoke(classObject, new object[] { obj});

如果我没看错,那是因为创建的对象在不同的​​程序集中,并且该方法期望的参数属于它自己的程序集。

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

我曾尝试通过 Reflection.EmitRunSharp 进行谷歌搜索并发现动态创建您自己的类。但是,我们只能在动态生成的程序集中使用它,而不能在现有程序集中创建动态方法或类。

我知道在运行时生成程序集不是好方法。但我现在什么也想不起来。感谢您的帮助。

最佳答案

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

这会阻止您在另一个程序集中伪造类型,除非您可以为该程序集提供完全相同的属性。简单地使用现有程序集要容易得多,在您的情况下应该没有问题,因为您只使用一个接口(interface)。

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

关于c# - 跨不同程序集版本传递类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8871079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com