Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET DLL需要接收一个Clarion回调过程,然后全部通过三个整数? 我正在编写一个克拉里恩的C...net DLL(克拉里恩是C++类似的编程语言)程序。_C#_.net_Callback_Clarion - Fatal编程技术网

C# .NET DLL需要接收一个Clarion回调过程,然后全部通过三个整数? 我正在编写一个克拉里恩的C...net DLL(克拉里恩是C++类似的编程语言)程序。

C# .NET DLL需要接收一个Clarion回调过程,然后全部通过三个整数? 我正在编写一个克拉里恩的C...net DLL(克拉里恩是C++类似的编程语言)程序。,c#,.net,callback,clarion,C#,.net,Callback,Clarion,我调用了C#NET动态链接库,一切正常。但是,我需要C#.NET DLL接收用于回调的Clarion过程,然后能够通过三个int参数调用该过程 Clarion程序如下所示(Clarion long是C#int): 如何将abvoe过程传递给C#.NET DLL,以及C#.NET DLL如何调用传递三个int参数的过程 提前感谢。希望此示例能为您提供一个起点,它基于SoftVelocity新闻组(缓存纯文本版本)中的一个示例 注意:我正在使用该软件包和Clarion LibMaker的修改版本创建

我调用了C#NET动态链接库,一切正常。但是,我需要C#.NET DLL接收用于回调的Clarion过程,然后能够通过三个int参数调用该过程

Clarion程序如下所示(Clarion long是C#int):

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


提前感谢。

希望此示例能为您提供一个起点,它基于SoftVelocity新闻组(缓存纯文本版本)中的一个示例

注意:我正在使用该软件包和Clarion LibMaker的修改版本创建兼容的lib文件。您提到您已经在毫无问题地调用C#DLL,因此我假设您正在做类似的事情。如果你感兴趣的话,我会在我的网站上进一步讨论这个问题

号角代码 C#代码
我也使用了RGiesecke DllExport包,不得不修改LibMaker提供的SoftVelocity以使其正常工作。当我有时间测试你的代码时,我会尝试一下。谢谢,太好了!我现在倾向于使用LoadLibrary API,一旦实现它,工作流程就不会那么痛苦了。我想您可以调整LibMaker以获取命令行参数,并以这种方式实现自动化。如何获得修改后的LibMaker?请在
MyCallBack procedure(long p1, long p2, long p3)
... Data ...
    code
    ... Code ...
  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'
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);

  }
}