c#如何共享程序集

找了好就都没找到,最后在微软看到这个,"如何在运行时位于一个不是应用程序的 bin 文件夹的文件夹中的程序集加载".

没想到标题是这样的,正是我想要的.

http://support.microsoft.com/kb/837908/zh-cn

 现在抽出用代码指定的方法:

方法 3: 使用 AssemblyResolve 事件

AssemblyResolve 事件时触发公共语言运行库试图绑定到程序集,并且失败。您可以使用 AddHandler 方法将事件处理程序添加到该应用程序中返回正确的程序集的每次 AssemblyResolve 事件时将触发。

AssemblyResolve 事件处理程序必须返回一个 [组件] 对象和公共语言运行库必须绑定到此对象。通常,您可以使用 Assembly.LoadFrom 方法加载程序集,然后返回该对象。若要这样做,请按照下列步骤操作:

  1. 创建一个新的类库项目,通过执行步骤 1 到 7 的步骤名为 MyAssembly3 该"方法 1: 在全局程序集缓存中安装该程序集 (GAC)"部分。
  2. 创建新的客户端应用程序。若要这样做,请按照下列步骤操作:
    1. 在 Visual Studio.net 或 Visual Studio 2005 中创建一个新的 Visual Basic.net 或 Visual Basic 2005 Windows 应用程序,或创建一个新的 Visual C#.net 或 Visual C# 2005 Windows 应用程序被命名为 TestClient3。

      默认状态下,Form1.vb 文件由 Visual Basic.net 或 Visual Basic 2005 创建。默认状态下,Form1.cs 文件由 Visual C#.net 或 Visual C# 2005年创建。
    2. 到 Form1.vb 文件或 Form1.cs 文件,请添加一个 按钮 控件。
    3. 双击该 Button1 控件,然后将下面的代码添加到 Button1_Click 事件:

      Visual Basic.net 或 Visual Basic 2005 代码
      Dim obj3 As New MyAssembly3.Class1()
      MessageBox.Show(obj3.HelloWorld())
      visual C#.net 或 Visual C# 2005年代码
      MyAssembly3.Class1 obj3=new MyAssembly3.Class1();
      MessageBox.Show(obj3.HelloWorld());
    4. 在解决方案资源管理器中,右击 添加引用

      添加引用 对话框。
    5. 单击 浏览,单击 MyAssembly3 程序集,然后单击 打开。
    6. 在引用文件夹中右击 MyAssembly3 程序集,然后单击 属性

      显示属性窗口。
    7. 在属性窗口中设置该 复制本地False, 程序集的属性。
  3. 将事件处理程序添加到 AssemblyResolve,如下所示 Form1_Load 事件中的事件:

    Visual Basic.net 或 Visual Basic 2005 代码
    AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
    
    visual C#.net 或 Visual C# 2005年代码
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
    
  4. 定义 MyResolveEventHandler 函数,如下所示:
    Visual Basic.net 或 Visual Basic 2005 代码
    Function MyResolveEventHandler(ByVal sender As Object, _
                                   ByVal args As ResolveEventArgs) As [Assembly]
            '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.
            Dim objExecutingAssemblies As [Assembly]
            objExecutingAssemblies = [Assembly].GetExecutingAssembly()
            Dim arrReferencedAssmbNames() As AssemblyName
            arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies()
    
            'Loop through the array of referenced assembly names.
            Dim strAssmbName As AssemblyName
            For Each strAssmbName In arrReferencedAssmbNames
    
                'Look 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(","))) Then
    
                    'Build the path of the assembly from where it has to be loaded.
                    Dim strTempAssmbPath As String
                    strTempAssmbPath = "C:\assemblies\" & args.Name.Substring(0, args.Name.IndexOf(",")) & ".dll"
    							       
                    Dim MyAssembly as [Assembly] 
    
                    'Load the assembly from the specified path. 
                    MyAssembly = [Assembly].LoadFrom(strTempAssmbPath)
    
                    'Return the loaded assembly.
                    Return MyAssembly
                End If
            Next
    
        End Function
    
    visual C#.net 或 Visual C# 2005年代码
    	
    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;			
    }
    
  5. 调试 菜单上单击 $ 开始 以运行该应用程序。

    注意您必须导入到运行此应用程序的 System.Reflection 命名空间。
  6. 单击 Button1 来调用 HelloWorld()MyAssembly3 程序集的方法。
原文地址:https://www.cnblogs.com/heimark/p/1851032.html