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()); }