zoukankan      html  css  js  c++  java
  • 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 程序集的方法。
  • 相关阅读:
    函数,封装
    c++增强c
    Git安装与使用
    Ajax&Jquery
    IntelliJ Idea2018.2,Pycharm20183.2破解教程
    事务&数据库连接池&DBUtils&JSP设计模式
    JSP&EL&JSTL
    Http协议和Servlet
    接收流信息---字符串
    lucene索引库优化一
  • 原文地址:https://www.cnblogs.com/heimark/p/1851032.html
Copyright © 2011-2022 走看看