C#根据CLSID或progid动态加载COM组件?

解决方案 »

  1.   

    Microsoft.VisualBasic.Interaction.CreateObject( "ProgId"
      

  2.   

    ms-help://MS.MSDNQTR.2003FEB.2052/vblr7/html/vafctCreateObject.htm
      

  3.   

    刚才反汇编一下CreateObject
    C# 可以这样
    Type comType = Type.GetTypeFromProgID(ProgId);
    object o =  Activator.CreateInstance(typeFromProgID);
    可以用反射调用
      

  4.   

    Interaction.CreateObject 方法 创建并返回对 COM 对象的引用。除非将类显式公开为 COM 组件,否则不能在 Visual Basic 中使用 CreateObject 创建这些类的实例。 命名空间:Microsoft.VisualBasic
    程序集:Microsoft.VisualBasic(在 microsoft.visualbasic.dll 中)语法
    Visual Basic(声明) 
    Public Shared Function CreateObject ( _
    ProgId As String, _
    <OptionalAttribute> Optional ServerName As String = "" _
    ) As Object
     
    Visual Basic(用法) 
    Dim ProgId As String
    Dim ServerName As String
    Dim returnValue As ObjectreturnValue = Interaction.CreateObject(ProgId, ServerName)
     
    C# 
    public static Object CreateObject (
    string ProgId,
    [OptionalAttribute] string ServerName
    )
     
    C++ 
    public:
    static Object^ CreateObject (
    String^ ProgId, 
    [OptionalAttribute] String^ ServerName
    )
     
    J# 
    public static Object CreateObject (
    String ProgId, 
    /** @attribute OptionalAttribute() */ String ServerName
    )
     
    JScript 
    public static function CreateObject (
    ProgId : String, 
    ServerName : String
    ) : Object
     
    参数
    ProgId
    必选。String。要创建的对象的程序 ID。ServerName
    可选。String。要在其上创建对象的网络服务器的名称。如果 ServerName 是空字符串 (""),则使用本地计算机。返回值
    创建并返回对 COM 对象的引用。除非将类显式公开为 COM 组件,否则不能在 Visual Basic 中使用 CreateObject 创建这些类的实例。 
    备注
    有关详细信息,请参见 Visual Basic 主题 CreateObject 函数 (Visual Basic)。若要创建 COM 组件的实例,请将 CreateObject 返回的对象赋给对象变量:  复制代码 
    Sub CreateADODB()
       Dim adoApp As Object
       adoApp = CreateObject("ADODB.Connection")
    End Sub
     用于存储返回对象的对象变量的类型会影响应用程序的性能。声明对象变量时使用 As Object 子句将创建一个可包含对任何对象类型的引用的变量。但是,通过该变量访问对象属于“后期绑定”,即在程序运行时进行绑定。避免后期绑定的原因很多,其中包括它会降低应用程序的性能。可以创建导致前期绑定(即在编译程序时执行绑定)的对象变量。若要这样做,请从“项目”菜单上“添加引用”对话框的“COM”选项卡中为对象添加对类型库的引用。然后将对象变量声明为具体的对象类型。多数情况下,使用 Dim 语句和主互操作程序集创建对象比使用 CreateObject 函数效率更高。与非托管代码交互
    另一个问题是 COM 对象使用非托管代码,即不具有公共语言运行库优点的代码。混合 Visual Basic 托管代码和 COM 中的非托管代码时具有相当的复杂度。添加对 COM 对象的引用时,Visual Basic 将搜索该库的主互操作程序集 (PIA);如果找到,则使用找到的 PIA。如果未找到 PIA,则将为 COM 库中的每个类创建一个包含局部互操作类的互操作程序集。有关更多信息,请参见 .NET Framework 应用程序中的 COM 互操作性。通常应尽可能使用强绑定对象和主互操作程序集。下面的示例在进行演示时使用了 Microsoft Office 对象和 CreateObject 函数。但是,与相应的主互操作程序集配合使用时,这些对象更易用且更可靠。在远程计算机上创建对象
    通过将计算机名称传递给 CreateObject 函数的 ServerName 参数,可以在远程网络计算机上创建对象。该名称与共享名称的“计算机名称”部分相同:对于名为“\\MyServer\Public”的共享,ServerName 为“MyServer”。注意 
    有关如何使应用程序能够在远程网络计算机上进行访问的其他信息,请参考 COM 文档(参见 Microsoft Developer Network)。可能需要为应用程序添加注册表项。
     下面的代码返回在名为 MyServer 的远程计算机上运行的 Excel 实例的版本号:  复制代码 
    Sub CreateRemoteExcelObj()
        Dim xlApp As Object
        ' Replace string "\\MyServer" with name of the remote computer.
        xlApp = CreateObject("Excel.Application", "\\MyServer")
        MsgBox(xlApp.Version)
    End Sub
     如果远程服务器的名称不正确或不可用,则将发生运行时错误。注意 
    对象当前没有任何实例时使用 CreateObject。如果对象的某个实例已在运行,则将启动新的实例,并创建指定类型的对象。若要使用当前实例,或启动应用程序并使其加载文件,请使用 GetObject 函数。如果对象已将本身注册为单实例对象,则无论执行多少次 CreateObject,都将仅创建该对象的一个实例。
     创建框架对象
    只能够使用 CreateObject 函数创建 COM 对象。虽然没有与创建 .NET Framework 对象完全等效的机制,System 命名空间中的 Activator 仍包含创建本地或远程对象的方法。特别是,可以使用 CreateInstance 方法或 CreateInstanceFrom 方法。安全注意 
    CreateObject 函数需要非托管代码权限,该权限在部分受信任的情况下会对执行有影响。有关更多信息,请参见 SecurityPermission 和代码访问权限。
     示例
    下面的示例使用 CreateObject 函数创建一个 Microsoft Excel 工作表,并将该工作表保存到文件中。若要使用此示例,运行此程序的计算机上必须安装了 Excel。此外,必须从“项目”菜单上“添加引用”对话框的“COM”选项卡中添加对类型库的引用。类型库的名称会因计算机上安装的 Excel 的版本不同而有所变化。例如,Microsoft Excel 2002 的类型库名为“Microsoft Excel 10.0 对象库”。
      

  5.   

    object jj;
                Type ii;            ii=Type.GetTypeFromProgID("test.test1");
                jj=Activator.CreateInstance(ii);
                ii.InvokeMember("show",System.Reflection.BindingFlags.InvokeMethod,null,jj,null);