C# 函数定义,C到.NET

C# 函数定义,C到.NET,c#,.net,c,dll,C#,.net,C,Dll,我有一些C代码,我已经转换成DLL。我需要从C程序调用DLL。我收到错误“试图读取或写入受保护的内存。这通常表示其他内存已损坏。” 所以,我认为我没有正确地转换我的函数原型,这导致了内存泄漏 C语言中的函数原型是 int __stdcall karacell_bridge( int argumentCount, char **argContent) 这是C#DLL调用中函数原型的正确转换吗 [DllImport("KaracellLib.dll", EntryPoint = "karacell

我有一些C代码,我已经转换成DLL。我需要从C程序调用DLL。我收到错误“试图读取或写入受保护的内存。这通常表示其他内存已损坏。”

所以,我认为我没有正确地转换我的函数原型,这导致了内存泄漏

C语言中的函数原型是

int __stdcall karacell_bridge( int argumentCount, char **argContent)
这是C#DLL调用中函数原型的正确转换吗

[DllImport("KaracellLib.dll", EntryPoint = "karacell_bridge@8", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern int karacell_bridge(int argumentCount, [In, Out]string[] argContent);

不,你需要整理第二个论点。我不确定是否有安全的PInvoke方法来封送可修改的字符串数组;这里似乎有很多故障模式。也许您可以尝试将字符串数组转换为
char*

数组。我们需要更多地了解DLL是如何编译的。为什么假定它是StdCall呢?我使用以下语句将C代码编译成DLL,例如.DLL、.def、.a文件创建gcc-shared-o KaracellLib.DLL karacell.obj-DDEBUG jytter.obj-W1、-output def、KaracellLib.def、-out implib、,libkaracell.gcc-shared-o KaracellLib.dll karacell.obj-DDEBUG jytter.obj-W1,--kill atI有理由添加StdCall,但现在无法回忆。但是,即使我删除该位并再次运行程序,也会抛出相同的错误。会抛出什么错误?是什么让你认为内存泄漏了?删除StdCall没有任何作用,因为这是默认设置。请使用
CallingConvention.Cdecl
进行尝试。引发的错误是“试图读取或写入受保护的内存。这通常表示其他内存已损坏”。我排除了发生此错误的许多可能性。我不确定我的功能原型是否正确。我可以试一试。知道如何在C#中初始化char*str[]数据类型吗?另外,如何取消引用和赋值?我对C#指针有点不清楚..将C函数原型更改为(int,char[],char[],char[],char[],char[],char[],char[])。并将C#one修改为相同的签名。还是一样的错误!我讨厌DLL!您是否已经解决了如何将字符串封送为
char[]
?对于您最近的工作尝试,您将需要它。我根本不使用字符串。我刚刚把这两个函数原型都转换成了char[],你知道如何正确封送吗?我不应该问两次问题!