C# visual studio COM创建及调用

1.visual studuio操作

        1.1visual Studio创建类库项目ClassLibrary1。

                1.1.1ClassLibrary1项目Class1.cs内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary1
{
    [ComVisible(true)]
    [Guid("D8C1EAA7-C829-46EF-A42E-2C9130467DB4")]
    interface IClass1
    {
        string Class1Property { get; set; }

        [DispId(1)]
        string Class1Function1();

        [DispId(1)]
        void Class1Function2(string message);

    }

    [ComVisible(true)]
    [Guid("CB5F70B2-3F6C-4410-B5B8-BD9C97042396")]
    [ProgId("ClassLibrary1.Class1")]//通过这个调用该COM组件
    public class Class1: IClass1
    {
        public string Class1Property { get; set; }
        public string Class1Function1()
        {
            Console.WriteLine($"Function1");
            return "Function1Result";
        }
        public void Class1Function2(string message)
        {
            Console.WriteLine($"Function1:{message}");
        }
    }
}

        1.2右键项目,左键”属性“。

        1.3勾选“生成“选项卡的”为COM互操作注册“勾选框。

        1.4勾选”签名“选项卡的”为程序集签名‘勾选框。

        1.5”左键选择强名称密钥文件“下拉框箭头,左键”新建“。

        1.6在”创建强名称密钥“弹窗中输入”密钥文件名称“文本框,取消”使用密码保护密钥文件“勾选框,左键”确定“。

        1.7.保存工程,关闭visual studio后以管理员模式运行,打开项目,右键项目,左键”重新生成“。

2.命令提示符操作

        2.1以管理员模式打开命令提示符(cmd),输入:

                cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64

                gacutil -i <dll路径>

                cd C:\Windows\WinSxS\wow64_regasm_b03f5f7f11d50a3a_4.0.15912.0_none_9dcb4fe8bf21aec2

                RegAsm <dll路径>

        随后即可在注册表HKEY_CLASSES_ROOT找到ProgId:ClassLibrary1.Class1。

3.调用              

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {

        static void Main(string[] args)
        {
            object obj = Activator.CreateInstance(Type.GetTypeFromProgID("ClassLibrary1.Class1"));
            obj.GetType().GetProperty("Class1Property").SetValue(obj,"hahaha1");
            Console.WriteLine((string)obj.GetType().GetProperty("Class1Property").GetValue(obj));
            Console.WriteLine((string)obj.GetType().GetMethod("Class1Function1").Invoke(obj,new object[] { }));
            obj.GetType().GetMethod("Class1Function2").Invoke(obj,new object[] {"hahaha2" });
        }
    }
}

4.结果