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

C#调用Clarion DLL传递参数时找不到入口点问题如何解决

核心问题原因
  1. 入口点名称大小写不匹配:Clarion导出的带参过程完整修饰名为ATUALIZAESTOQUENOVO_TESTE@Fsb,你C#代码中DllImport的EntryPoint写为ATUALIZAESTOQUENOVO_TESTE@FSB,后缀的sb被误写为全大写,而Windows系统下DLL入口点查找是大小写敏感的,这是触发找不到入口错误的直接原因。
  2. 隐式互操作规则不兼容:即便修正入口点名称,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:57:03