You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从C++原生代码向C# DLL的PrintPDF方法传递LPWSTR?

解决C++原生代码向C# DLL方法传递LPWSTR的问题

嘿,这个问题我做.NET和C++互操作的时候也碰到过——本质就是原生宽字符串(LPWSTR)和CLR托管字符串(System.String)的类型不兼容,结合你已经用#using <MyDll.dll>引入DLL的情况,给你几个直接可行的解决方案:

方案一:用C++/CLI的System::String做中间转换

既然你已经用了#using,说明你的C项目应该是支持C/CLI的(如果还没开启,记得去项目属性 -> 配置属性 -> C/C++ -> 常规里,把公共语言运行时支持设为/clr)。我们可以借助System::String的构造函数,直接把LPWSTR(本质就是wchar_t*)转换成托管字符串:

// 假设你有原生LPWSTR类型的变量
LPWSTR printer = L"HP LaserJet Pro M28w";
LPWSTR sheetFormat = L"A4";
LPWSTR pdfPath = L"C:\\Users\\Matteo\\Documents\\sample.pdf";
int copyCount = 2;

// 将原生LPWSTR转换为CLR托管的String^
System::String^ managedPrinter = gcnew System::String(printer);
System::String^ managedSheetFormat = gcnew System::String(sheetFormat);
System::String^ managedPath = gcnew System::String(pdfPath);

// 直接调用C#的PrintPDF方法(替换成你实际的命名空间和类名)
MyDll::PrintHelper::PrintPDF(managedPrinter, managedSheetFormat, managedPath, copyCount);

简化写法(针对常量字符串)

如果你的LPWSTR是编译期常量(比如直接写L"xxx"),C++/CLI支持直接隐式转换,不用手动gcnew,代码会更简洁:

// 直接传递原生宽字符串字面量,编译器会自动转为System::String^
MyDll::PrintHelper::PrintPDF(L"HP LaserJet Pro M28w", L"A4", L"C:\\sample.pdf", 2);

关键注意事项

  • 项目配置:必须确保C项目启用了公共语言运行时支持(/clr),否则#using、gcnew以及System::String这些C/CLI特性都无法使用。
  • 内存管理:如果你的LPWSTR是动态分配的(比如用malloc/wcsalloc申请的内存),转换完成后要记得手动释放原生内存;托管字符串的内存由CLR垃圾回收负责,不用你手动处理。
  • 编码兼容性:LPWSTR是UTF-16编码的宽字符串,和C#的System.String内部编码完全一致,所以转换过程不会有编码丢失或乱码问题。

额外提示:纯原生C++的替代方案

如果你的项目是纯原生C++(不能启用/clr),那你需要改用P/Invoke的方式调用C# DLL:

  1. 在C# DLL里,给PrintPDF方法加上[DllExport]特性(需要先安装UnmanagedExports NuGet包)
  2. 在纯原生C++里,用extern "C"声明该函数,直接传递LPWSTR即可(DllExport会自动处理字符串的转换逻辑)

不过既然你已经用了#using,显然C++/CLI的方案更直接省心,优先推荐第一种。

内容的提问来源于stack exchange,提问作者Matteo Meil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:41:23