在.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);
需要注意的是,这种方法有一些限制: