无引用程序集方法调用框架

.NET环境中,经常会遇到需要动态加载并执行程序集中的方法的情况。这在处理不依赖于特定程序集版本的情况下尤其有用。本文将介绍一种方法,允许.NET应用程序在不直接引用程序集的情况下,动态地加载并执行其中的方法。

在开发过程中,可能会遇到需要从客户端应用程序中获取数据,并将这些数据作为参数传递给存储过程的情况。为了实现这一功能,需要一种机制,能够在不引用客户端应用程序的情况下,执行其定义的方法。

解决方案概述

为了解决这个问题,设计了一个框架,它允许客户端应用程序定义一个存储过程,并在执行完成后,将结果通过电子邮件发送给相关方。这个框架的核心是实现一种机制,允许用户从查找表、Web服务数据和应用程序派生数据中指定参数值。

实现方法

首先需要一个机制来预填充查找表数据。这可以通过一个简单的ParameterLookup表来实现。然而,当涉及到使用Web服务数据或应用程序特定数据来预填充查找表时,需要一种机制来执行客户端应用程序中的方法。

首先尝试使用Type.GetType()方法来加载程序集。这个方法允许加载项目中引用的程序集,或者在程序集搜索路径中的程序集。但是,由于框架代码不会引用客户端应用程序,只能希望程序集位于程序集搜索路径中。虽然这种情况是可能的,但并不保证。

接下来,尝试使用Assembly.LoadFrom()方法。这个方法允许加载任何位置的程序集,并遍历其中定义的所有类型。通过这种方法,可以加载程序集并提取适当的类型以供使用。

如果目标类型所在的程序集已经被安装到全局程序集缓存(GAC)中,可以利用CLR的程序集管理系统来加载并找到程序集。通过使用Fusion.dll,可以创建对适当GAC(32位或64位)的引用,并使用Assembly.LoadFrom()方法安全地加载程序集。

代码实现

以下是使用上述方法的示例代码:

// 使用Type.GetType()方法 Type t = Type.GetType("MyCompany.MyApplication.Lookup.SomeLookup, MyCompany.MyApplication"); // 使用Assembly.LoadFrom()方法 internal static Type GetTypeFromAssembly(string assemblyName, string typeName) { Assembly assembly = Assembly.LoadFrom(gacPath); Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.FullName == typeName) return type; } return null; } // 使用Fusion.dll [DllImport("fusion.dll")] internal static extern int CreateAssemblyCache(out IAssemblyCache ppAsmCache, int reserved);

使用限制

需要注意的是,这种方法有一些限制:

  • 程序集必须注册在GAC中才能使用这种方法。
  • 不会加载不兼容的.NET版本程序集。
  • 会解析到最高版本,而不是最近编译的版本。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485