gpt4 book ai didi

c# - .NET DLL 需要接收一个 Clarion 回调过程,然后将其全部传递三个整数吗?

转载 作者:行者123 更新时间:2023-11-30 16:17:09 25 4
gpt4 key购买 nike

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

我很好地调用了 C# .NET DLL,一切正常。但是,我需要 C# .NET DLL 接收用于回调目的的 Clarion 过程,然后能够调用该过程并传递三个 int 参数。

Clarion Procedure 看起来像这样(Clarion long 是 C# int):

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

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

提前致谢。

最佳答案

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

注意:我使用的是 RGiesecke DllExport包和 Clarion LibMaker 的修改版本以创建兼容的 lib 文件。您提到您已经毫无问题地调用 C# DLL,所以我假设您正在做类似的事情。如果您有兴趣,我将在我的 blog 上进一步探讨。 .

号角代码

  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);

}
}

关于c# - .NET DLL 需要接收一个 Clarion 回调过程,然后将其全部传递三个整数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17578527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com