C#调用Clarion DLL传递参数时找不到入口点问题如何解决
核心问题原因
- 入口点名称大小写不匹配:Clarion导出的带参过程完整修饰名为
ATUALIZAESTOQUENOVO_TESTE@Fsb,你C#代码中DllImport的EntryPoint写为ATUALIZAESTOQUENOVO_TESTE@FSB,后缀的sb被误写为全大写,而Windows系统下DLL入口点查找是大小写敏感的,这是触发找不到入口错误的直接原因。 - 隐式互操作规则不兼容:即便修正入口点名称,C#默认的字符串封送规则、调用约定也可能和Clarion DLL的规则不匹配,引发后续乱码、程序崩溃问题。
具体解决方案
立即修复方案
替换你原有的C# extern声明为如下内容:
[DllImport("C:\\Tests\\48\\prog\\ss007.dll", EntryPoint = "ATUALIZAESTOQUENOVO_TESTE@Fsb", CallingConvention = CallingConvention.StdCall)] public static extern void ATUALIZAESTOQUENOVO_TESTE([MarshalAs(UnmanagedType.LPStr)] string pr);
修正点说明:
- 入口点后缀改为和导出名完全一致的小写
@Fsb - 显式指定调用约定为StdCall,匹配Clarion DLL过程的默认调用规则
- 给字符串参数添加封送标记,指定传递ANSI编码字符串,匹配Clarion默认的string类型编码
长期优化方案(可选)
如果后续需要频繁调用Clarion DLL的导出过程,可以在Clarion侧声明过程时手动指定导出名称,避免依赖编译器自动生成的修饰名,降低大小写、参数后缀写错的概率:
Clarion侧代码修改:
AtualizaEstoqueNovo_Teste PROCEDURE (string pr),NAME('AtualizaEstoqueNovo_Teste') CODE
修改后C#侧的声明可以简化为:
[DllImport("C:\\Tests\\48\\prog\\ss007.dll", EntryPoint = "AtualizaEstoqueNovo_Teste", CallingConvention = CallingConvention.StdCall)] public static extern void ATUALIZAESTOQUENOVO_TESTE([MarshalAs(UnmanagedType.LPStr)] string pr);
内容的提问来源于stack exchange,提问作者Leonardo Dalcegio
相关产品推荐
相关产品推荐

