前言
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);