如何从 C# 代码的库中调用 C 方法?

Posted

技术标签:

【中文标题】如何从 C# 代码的库中调用 C 方法?【英文标题】:How can I call a C method from a library on my C# code? 【发布时间】:2014-05-20 15:46:54 【问题描述】:

我有一个 DLL (CliSiTef32I.dll),我需要在我的 C# 代码上调用以下方法:

//The DLL can be downloaded at http://54.197.252.236/se/CliSiTef32I.dll

long ConfiguraIntSiTefInterativoEx(
   char* IPSiTef, 
   char* IdLoja,
   char* IdTerminal, 
   short Reservado, 
   char* ParametrosAdicionais
   )

long IniciaFuncaoSiTefInterativo(
   long Funcao, 
   char* Valor, 
   char* CupomFiscal, 
   char* DataFiscal, 
   char* HoraFiscal, 
   char* Operador, 
   char* ParamAdic
   )

我该怎么做?

【问题讨论】:

如何执行此操作取决于您未提供的信息。什么是调用约定?是cdecl吗? char* 参数是什么。它们是字符串吗?什么编码? ANSI? ASCII? UTF-8?它们是输入参数吗?还是他们输出?这似乎不太可能。 【参考方案1】:

这些可能会起作用:

[DllImport("CliSiTef32I.dll")]
public static extern int ConfiguraIntSiTefInterativoEx (
    byte[] IPSiTef, 
    byte[] IdLoja, 
    byte[] IdTerminal, 
    short Reservado, 
    byte[] ParametrosAdicionais)

[DllImport("CliSiTef32I.dll")]
public static extern int IniciaFuncaoSiTefInterativo (
    long Funcao, 
    byte[] Valor, 
    byte[] CupomFiscal, 
    byte[] DataFiscal, 
    byte[] HoraFiscal, 
    byte[] Operador, 
    byte[] ParamAdic)

不过,我并不完全确定 short 的含义。如果这是一个 16 位有符号整数,这将起作用。

此外,如果您返回的 32 位 int 确实是布尔值,您可以这样声明返回值。

【讨论】:

为什么要使用 byte[] 而不是 char[]? @Felipe 因为 c# char 不是 16 位,不像 c char 是 8 位。 那么,如何将c#字符串转换为byte[]? @Felipe 可能是Encoding.Default.GetBytes(somestring) 见msdn.microsoft.com/en-us/library/ds4kkd55.aspx 和msdn.microsoft.com/en-us/library/… C++ long 是 C# int。很可能所有char* 参数都简单地转换为string

以上是关于如何从 C# 代码的库中调用 C 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWIG 从 C 调用 C# 方法?

如何从 C# 中的 Python 脚本调用特定方法?

如何从本机 C(++) DLL 调用 .NET (C#) 代码?

从汇编代码调用库中的 C 函数

从 C# 调用 C/C++ 代码

如何通过 C++-CLI 回调和委托将字符串从 C++-CLI 传递到 C#