c++调用c# com

c++ 调用c#dll (2种方式,com组件和clr工程)_c++调用c#dll-CSDN博客

C++调用C#总结_clrcreateinstance-CSDN博客

VS2017使用C#编写COM组件_registerforcominterop-CSDN博客

C#开发COM组件 - Mask1 - 博客园 (cnblogs.com)

 

//如果线程入口是成员变量,参考这个代码(在gitee上):this->th2 = new thread(&MySerialPort::读线程入口, this, 等待毫秒);

c#中必要定义interface,guid,以及不同的接口用[DispId(1)]标明,数字累计。以下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ljqcom
{
    [Guid("7D73DC45-964D-4743-9E90-FDA32906F9A9")]
    [ComVisible(true)]
    public interface ImyClass
    {
        [DispId(1)]
        int add(int m, int n);
        [DispId(2)]
        string strto(string str);
    }

    [Guid("7D73DC45-964D-4743-9E90-FDA32906F9A5")]
    [ClassInterface(ClassInterfaceType.None)]
    public class myClass : ImyClass
    {
        public static int s = 0;
        private int d = 0;
        public int add(int m, int n)
        {
            return m + n + 1 + Class1.ONE.pp();
        }

        public string strto(string str)
        {
            return "静态:" + (s++) + ", 动态:" + (d++).ToString() ;
        }
    }
}

c++的调用示例:

#include "stdafx.h"
#include <iostream>
#include <atlcomcli.h>
#import "ljqcom.tlb"
//把c#生成的tlb文件放在c++代码下,上面import即可引用
using namespace std;
//using namespace ljqcom;

void a1()
{
    ljqcom::ImyClassPtr p; 
    p.CreateInstance(__uuidof(ljqcom::myClass));
    int m = p->add(20, 3);
    bstr_t str = "123雷";
    bstr_t str2 = p->strto(str);
    cout << "a1-" << str2 << endl;
    cout << "a1-" << m << endl;
    bstr_t str3 = p->strto(str);
    cout << "a1-" << str3 << endl;
}
void a2()
{

    CComPtr<ljqcom::ImyClass> pc;
    pc.CoCreateInstance(__uuidof(ljqcom::myClass));
    int x= pc->add(3, 2);
    cout << "a2-" <<x<< endl;
     
}
int main()
{
    CoInitialize(NULL); //这一行不要少了,否则创建com实例时为NULL

    a1();
    a1();
    a2();
    

    getchar();
    return 0;
}

 

 关于状态:

1. com不会自动运行,当c++调用后才运行,好像不是独立进程。c++程序退出后,com就自动关闭了。

2. 两个c++客户端同时调用com时,com都是独立的,互不影响,

3. com中的静态函数在同一程序中是有状态的。

4. 上面的测试代码a1函数在main中调用了两次,com中的静态成员在累计,即保有状态。

下面是执行结果:

a1-静态:0, 动态:0
a1-124
a1-静态:1, 动态:1
a1-静态:2, 动态:0
a1-124
a1-静态:3, 动态:1
a2-106
2024/1/4 20:50:50, 0

 

调用有两种方式:

 ljqcom::ImyClassPtr p; 
 p.CreateInstance(__uuidof(ljqcom::myClass));

 

CComPtr<ljqcom::ImyClass> pc;
pc.CoCreateInstance(__uuidof(ljqcom::myClass));

 不要忘记了在实例化前先调用:CoInitialize(NULL)

以及:#include <atlcomcli.h>

 

以下C#的字符串和std:string之间互转:

string Clr字符串转Cpp(System::String^ strClr)
{
const char* chars = (const char*)(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strClr)).ToPointer();
string str = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
return str;
}

System::String^ Cpp字符串转Clr(string str)
{
return gcnew String(str.c_str());
}

  

 

posted @ 2023-12-27 22:51  81  阅读(60)  评论(0编辑  收藏  举报