-1

我有一个 Clarion Dll,我需要从 C# 调用其中的一个过程(我可以访问这两个代码)。

如果我不尝试将任何参数传递给过程,它会完美运行。

这是实际的 Clarion 代码,里面没有任何内容,我只是将其用于测试目的。

AtualizaEstoqueNovo_Teste PROCEDURE  (string pr)           ! Declare Procedure
    CODE

过程 MAP 声明。

50A5C8 ATUALIZAESTOQUENOVO_TESTE@Fsb

从 C# 端开始,我声明了一个 extern void 函数。

[DllImport("C:\\Tests\\48\\prog\\ss007.dll", EntryPoint = "ATUALIZAESTOQUENOVO_TESTE@FSB")]
    public static extern void ATUALIZAESTOQUENOVO_TESTE(string pr);   

我像其他任何函数一样调用它

ATUALIZAESTOQUENOVO_TESTE("");

它向我抛出错误“无法找到名为“ATUALIZAESOQUENOVO_TESTE@FSB”的入口点”

有趣的是,如果我尝试做同样的事情但不使用任何参数,它会起作用。

这就是我声明没有参数的函数的方式:

[DllImport("C:\\Tests\\48\\prog\\ss007.dll", EntryPoint = "ATUALIZAESTOQUENOVO_TESTE@F")]
    public static extern void ATUALIZAESTOQUENOVO_TESTE();

我真的不知道我错过了什么。

此外,C# 代码位于 Windows 服务中,但我认为这无关紧要

4

1 回答 1

0

所以,我找到了一种让它工作的方法,你不必通过“@Fsb”。

const UnmanagedType MYSTRING1 = UnmanagedType.BStr; // marshaled bstring

[DllImport(@"C:\\Tests\\48\\prog\\ss007.dll", EntryPoint = "ATUALIZAESTOQUENOVO_TESTE")]
public static extern void ATUALIZAESTOQUENOVO_TESTE([MarshalAs(MYSTRING1)] string MYSTRING1);        
于 2021-08-31T18:27:28.717 回答