C#调用外部vc++ dll ,如何传递引用型字符串数组?
#define DLLEXPORT extern "C" __declspec(dllexport)
extern "C" __declspec(dllexport) int __stdcall StringTest( wchar_t **& str1,wchar_t ** tr2,int iarray);
DLLEXPORT int __stdcall StringTest( wchar_t **& str1,wchar_t ** str2,int iarray)
{
for (int i=0;i<iarray;i++)
{
wcscat(str1[i],str2[i]);
}
return 1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
C#下调用:
//外部dll函数申明
[DllImport("csdll.dll", EntryPoint = "StringTest", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
private static extern int StringTest([MarshalAs(UnmanagedType.LPArray)]ref string[] str1, string[] str2, int iarray);
//主函数调用
string[] sParmIds = new String[4];
string[] sParmValues = new String[4];
sParmIds[0] = "炉膛宽度";
sParmIds[1] = "炉膛高度";
sParmIds[2] = "字符串";
sParmIds[3] = "小数";
sParmValues[0] = "4500";
sParmValues[1] = "3500";
sParmValues[2] = "长江黄河";
sParmValues[3] = "3.6";
StringTest(ref sParmIds, sParmValues,4);//在这一步,报错。其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

for (int i = 0; i < 3; i++)
MessageBox.Show(sParmIds[i]);
//我的意图是,返回的sParmIds数组为:
//sParmIds[0]=="炉膛宽度4500"
//sParmIds[1]== "炉膛高度3500";
//sParmIds[2]== "字符串长江黄河";
//sParmIds[3]== "小数3.6";
请教诸位,此问题如何解决?
相关推荐
C#调用C++的dll实例,回调函数,string和int数组参数传递
本实例将详细介绍如何在C#中调用C++的DLL,并处理回调函数、字符串和整型数组参数的传递。首先,C++的DLL需要定义导出函数,以便C#能够访问。
C#调用C++ DLL实战:解决“找不到入口点”与“调用崩溃”难题
在软件开发中,托管代码与非托管代码的互操作是一项关键技术,它允许不同语言编写的模块协同工作,以发挥各自的性能与生态优势。其核心原理是通过平台调用机制,在运行时进行函数查找、参数封送与执行上下文切换。这项技术的价值在于能够复用成熟的C/C++高性能库或硬件驱动,为上层应用提供强大的底层能力。在工业控制、游戏开发、音视频处理等对性能有严苛要求的场景中,这种混合编程模式尤为常见。然而,实践中常会遇到“找不到入口点”和“调用时崩溃”两大典型问题,其根源往往在于函数名称修饰、调用约定不匹配或内存封送错误等细节。本文将
C#调用C++ DLL完整指南:从P/Invoke到生产环境实战
在软件开发中,互操作技术是实现不同编程语言和运行时环境间通信的关键机制。其核心原理是通过定义清晰的接口规范和数据转换规则,在托管代码(如C#/.NET)与非托管代码(如原生C++)之间搭建桥梁。这项技术的价值在于能够复用经过高度优化的原生库、集成遗留系统模块,并突破托管环境在特定场景下的性能限制。典型应用场景包括工业控制、图像处理、硬件驱动集成以及高性能计算模块的调用。本文聚焦于C#与C++动态链接库(DLL)的互操作,深入探讨了P/Invoke这一核心技术,并针对内存管理和部署依赖等常见挑战提供了解决方案
VC++6.0 DLL回调函数实战:从底层原理到跨语言调用
动态链接库(DLL)是Windows平台实现代码复用和模块化开发的核心技术,其本质是一个包含编译后函数和数据的二进制文件,可在运行时被多个程序共享加载。回调函数则是实现模块间通信和可扩展性的关键机制,它允许一个模块将函数指针作为参数传递给另一个模块,并在特定时机被调用,从而实现诸如事件处理、自定义算法逻辑等灵活功能。理解DLL与回调的结合,对于构建插件化系统、硬件驱动交互或跨语言集成具有重要技术价值。在VC++6.0这一经典环境中手动实现DLL回调,能清晰揭示函数指针、调用约定(如__stdcall与__c
C#调用C++DLL传递结构体数组的终极解决方案
【C#调用C++DLL传递结构体数组的终极解决方案】在C#和C++混合编程中,常常需要跨语言调用DLL中的函数,而结构体数组是常见的数据传输对象。


