从C#应用程序调用本地.NET(2)COM +组件

时间:2011-06-10 23:06:35

标签: c# .net com+

我已经创建了一个.NET 2 COM +组件,供我们古老的经典ASP网站使用。这在传统ASP中非常简单......

Dim MenuManager : Set MenuManager = Server.CreateObject("MenuManager.MenuManager")

但是,我想使用C#控制台应用程序对组件进行性能配置文件。

如何在C#控制台应用程序中调用它?

2 个答案:

答案 0 :(得分:7)

您正在使用CreateObject()函数进行后期绑定。您想窃取,请求或借用VS2010的副本以使用C#4.0 动态关键字来轻松完成。这是类似的代码,适用于任何机器。它使用后期绑定来创建FileSystemObject COM组件,前两行等同于您的代码片段。它列出了c:\ windows文件夹的子目录:

using System;

class Program {
    static void Main(string[] args) {
        var type = Type.GetTypeFromProgID("Scripting.FileSystemObject");
        dynamic obj = Activator.CreateInstance(type);
        dynamic win = obj.GetFolder("c:/windows");
        foreach (dynamic subwin in win.SubFolders) {
            Console.WriteLine(subwin.Name);
        }
        Console.ReadLine();
    }
}

如果您不能使用C#版本4,请考虑使用VB.NET。它具有相同的语法,并且还具有CreateObject()函数。

答案 1 :(得分:0)

要从C#调用本机代码COM对象,请选择“添加引用”,然后选择“COM”选项卡并使用它来添加对COM对象类型库的引用。这将运行TLBIMP来导入您的类型库并为COM对象生成一组很好的包装器和类型。然后,您只需使用这些类型和包装器来实例化COM对象并调用其方法。

这对使用托管代码实现的COM对象不起作用。 TLBIMP工具注意到类型库是从托管代码生成的,并拒绝导入它。相反,它建议您只需向程序集添加.NET引用。

您可以手动as described here构建一组COM包装器。但是当你可以使用@Hans建议的更直接的解决方案时,这似乎是一项非常多的工作