C++操作C#动态库


前言

C# 读取CPU 和 硬盘信息封装到DLL。

C++调用C#的dll测试。


一、创建C#的库

对设备的CPU和硬盘型号进行读取。

using System.Management;
using System.Security.Cryptography;
namespace ClassLibrary1
{
    public class Class1
    {
        public string name = "元芳";

        public string GetDeviceId()
        {
            string cpuInfo = "";
            try
            {
                ManagementClass mc = new ManagementClass("Win32_Processor");
                ManagementObjectCollection moc = mc.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
                }
                moc = null;
                mc = null;
            }
            catch
            {
            }
            String HdInfo = "";
            try
            {

                ManagementClass mc = new ManagementClass("Win32_DiskDrive");
                ManagementObjectCollection moc = mc.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    HdInfo = (string)mo.Properties["Model"].Value;
                }
                moc = null;
                mc = null;

            }
            catch
            {

            }


            using (MD5 md5 = MD5.Create())
            {
                var bytes = Encoding.UTF8.GetBytes(cpuInfo + HdInfo);
                var hashbytes = md5.ComputeHash(bytes);
                string  strTemp= BitConverter.ToString(hashbytes);

                return strTemp+"元芳";               
            }
        }
    }
}

二、C++新建MFC 基于对话框的模板

测试按钮

1.引入库

//1:添加dll的位置
#using "E:\CXTest\111FunTest\Out\Debug\ClassLibrary1.dll"
#pragma managed
//2:添加命令空间
using namespace ClassLibrary1;

//添加测试程序

void CMFCApp1Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	AfxMessageBox(GetDeviceInfo());
}

CString CMFCApp1Dlg::GetDeviceInfo()
{
	
	ClassLibrary1::Class1^ aaa = gcnew ClassLibrary1::Class1();
	
	char* chars = "Hello";
	string s(chars);
	CString ss(chars);
	System::String^ sss = gcnew System::String(chars);

	CString ddd = (aaa->name);
	AfxMessageBox(ddd);

	CString str = aaa->GetDeviceId();
	return	str;
}

2.显示数据

C# class1的name属性。
在这里插入图片描述
C# class1的GetDeviceId方法。
在这里插入图片描述

总结

gcnew和普通的new的区别:
C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换* ,就语义上来说他们的区别大致如下:

gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址. 
 gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放.

从char转换:
char chars = “Hello”;
从char
到string: string s(chars);
从char
到CString: CString s(chars);
从char*到String^: String ^s = gcnew String(chars);

从CString转换
CString str(“Hello”);
从CString到char*: char chars[64]; strcpy_s(chars, str);
从CString到string: string s(str);
从CString到String^: String ^s = gcnew String(str);

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值