.NET DLL需要接收一个Clarion回调过程,然后将其全部传递三个int

本文关键字:int 然后 三个 全部 Clarion DLL 回调 NET 一个 过程 | 更新日期: 2023-09-27 18:21:48

我正在为Clarion(Clarion是一种类似C++的编程语言)程序编写一个C#.NET DLL。

我调用C#.NET DLL很好,一切都很好。但是,我需要C#.NET DLL来接收Clarion过程以进行回调,然后能够通过三个int参数调用该过程。

Clarion过程看起来是这样的(Clarion长度是C#整数):

MyCallBack procedure(long p1, long p2, long p3)
... Data ...
    code
    ... Code ...

如何将abvoe过程传递给C#.NET DLL,以及C#.NET DLL如何通过三个int参数调用该过程?

提前谢谢。

.NET DLL需要接收一个Clarion回调过程,然后将其全部传递三个int

希望这个例子能给你一个起点,它是基于SoftVelocity新闻组的一个例子(这里是缓存的纯文本版本)。

注意:我使用RGiesecke DllExport包和Clarion LibMaker的修改版本来创建兼容的lib文件。你提到你已经在毫无问题地调用C#DLL了,所以我假设你也在做类似的事情。如果你感兴趣的话,我会在我的博客上进一步探讨。

Clarion代码

  PROGRAM
  MAP
    MODULE('ManagedCSharpDLL.dll')
CallbackProc                PROCEDURE(BSTRING PassedValue, *BSTRING ReturnValue),TYPE,PASCAL,DLL(TRUE)
SetCallback                 PROCEDURE(*CallbackProc pCallback),NAME('SetCallback'),PASCAL,RAW,DLL(TRUE)
TestCallback                PROCEDURE(*CString passedString),NAME('TestCallback'),PASCAL,RAW,DLL(TRUE)
    END
Callback                PROCEDURE(BSTRING PassedValue, *BSTRING ReturnValue),PASCAL
  END
a                   CSTRING(20)
CODE
  Message('Clarion: SetCallback(Callback)')
  SetCallback(Callback)
  a = 'Call Test Worked'
  Message('Clarion: Send message: ' & a)
  TestCallback(a)
  Message('Clarion: Made call and got back safely')
Callback      PROCEDURE(BSTRING PassedValue, *BSTRING ReturnValue)
  CODE
    MESSAGE('Clarion: Passed Value: ' & PassedValue)
    ReturnValue = 'Done'

C#代码

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using RGiesecke.DllExport;
namespace ManagedCSharpDLL
{
  public static class UnmanagedExports
  {
    private static CallbackProc _callback;
    [DllExport("SetCallback", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static void SetCallback(CallbackProc pCallback)
    {
      _callback = pCallback;
      MessageBox.Show("C#: SetCallback Completed");
    }
    [DllExport("TestCallback", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static void TestCallback(string passedString)
    {
      string displayValue = passedString;
      string returnValue = String.Empty;
      MessageBox.Show("C#: About to call the Callback. displayValue=" + displayValue + ", returnValue=" + returnValue);
      _callback(displayValue, ref returnValue);
      MessageBox.Show("C#: Back from the Callback. displayValue=" + displayValue + ", returnValue=" + returnValue);
    }
    public delegate void CallbackProc( [MarshalAs(UnmanagedType.BStr)] String PassedValue,  [MarshalAs(UnmanagedType.BStr)] ref String ReturnValue);
  }
}