我的应用程序引用了 Microsoft.Data.SqlXml.dll 程序集( SQLXML 的一部分)。但是在不同的机器上,根据它的实时环境或测试,还是开发人员本地PC,安装了不同版本的 SQLXML 。这引起了一个问题:根据目标计算机,我必须针对正确的 Microsoft.Data.SqlXml.dll 程序集编译应用程序。
在Subversion中,我保留了在实时环境中使用的csproj和dll文件。当我必须在本地测试利用 Microsoft.Data.SqlXml.dll 的模块时,我会更改项目中的引用,并将其还原。但有几次我忘了回滚更改,我检查了csproj和 Microsoft.Data.SqlXml.dll ,其版本不符合在实时服务器上安装的 SQLXML 。结果,我收到了运行时错误。
我的问题是:有没有办法在运行时动态加载程序集?我可以在应用程序中的某处使用switch语句,根据app.config中的条目加载正确的程序集(例如env =“live | test | local”)?或许还有另一种方法来解决这个问题?
谢谢,帕维尔
答案 0 :(得分:1)
来自Microsoft page:
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
private Assembly MyResolveEventHandler(object sender,ResolveEventArgs args)
{
//This handler is called only when the common language runtime tries to bind to the assembly and fails.
//Retrieve the list of referenced assemblies in an array of AssemblyName.
Assembly MyAssembly,objExecutingAssemblies;
string strTempAssmbPath="";
objExecutingAssemblies=Assembly.GetExecutingAssembly();
AssemblyName [] arrReferencedAssmbNames=objExecutingAssemblies.GetReferencedAssemblies();
//Loop through the array of referenced assembly names.
foreach(AssemblyName strAssmbName in arrReferencedAssmbNames)
{
//Check for the assembly names that have raised the "AssemblyResolve" event.
if(strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(","))==args.Name.Substring(0, args.Name.IndexOf(",")))
{
//Build the path of the assembly from where it has to be loaded.
strTempAssmbPath="C:\\Myassemblies\\"+args.Name.Substring(0,args.Name.IndexOf(","))+".dll";
break;
}
}
//Load the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
//Return the loaded assembly.
return MyAssembly;
}
当然,您必须使用所需内容更改部分//Build the path of the assembly
。