小编Cha*_*nst的帖子

使用强命名程序集中的反射创建类型实例的问题

我有一个部署在客户端上的现有.NET 2.0 Win Forms解决方案.为了这个场景,我们称之为'WinApp.exe'.WinApp.exe直接引用名为"Assembly.dll"的专用程序集.Assembly.dll直接引用另一个名为"Framework.dll"的程序集.Framework.dll中是一个名为"IPlugIn"的类型.Framework.dll没有强名称,但程序集的版本是1.0.Assembly.dll中有一个类从Framework.dll实现IPlugIn.

我有另一个名为'Framework.exe'的.NET 2.0 Win Forms解决方案.此Win Forms项目还直接引用Framework.dll,其中定义了"IPlugIn"类型.Framework.dll没有强名称,但此程序集的版本是2.0.一点一点,Framework.dll v2中的'IPlugIn'与Framework.dll v1中的'IPlugIn'相同.Framework.exe中的代码使用反射来加载WinApp中的IPlugIn实现:

AssemblyName an = AssemblyName.GetAssemblyName("C:\\Program Files\\WinApp\\Assembly.dll");
Assembly dll = Assembly.Load(an);
object o = Activator.CreateInstance(dll.GetType("WinApp.ClassThatImplementsIPlugIn"));
IPlugIn iPlugIn = o as IPlugIn;
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.这段代码有效!现在这是麻烦的部分.我需要为Framework.dll v2分配一个强名称,以便它可以放在GAC中.但是,WinApp及其依赖程序集将不会重新部署 - 它必须继续使用它当前使用的相同版本的程序集.当我给Framework.dll v2一个强名称并重新编译并运行Framework.exe时,当上面的代码执行时,我在线上收到一个"InvalidCastException":

IPlugIn iPlugIn = o as IPlugIn;
Run Code Online (Sandbox Code Playgroud)

我想我收到了这个例外,因为现在一个版本的Framework.dll有一个强名称,运行时正在将类型"IPlugIn"视为完全不同的类型.我需要知道是否有任何方法可以解决这个问题.同样,要求是:

  1. 我必须能够将Framework.dll v2放在GAC中(因此它必须具有强名称).
  2. WinApp必须继续像现在一样工作(继续引用Framework.dll v1).我无法为WinApp重新分发新编译的程序集.

提前致谢!

乍得

.net reflection

5
推荐指数
1
解决办法
675
查看次数

标签 统计

.net ×1

reflection ×1