如何在C#中通过引用创建dll函数,从MQL4接受值并返回它?

如何在C#中通过引用创建dll函数,从MQL4接受值并返回它?,c#,dll,mql4,C#,Dll,Mql4,以下是原始函数: public static void GetEvent ( int event_n, ref string el_name, ref int id, ref long lparam, ref double dparam, ref string sparam) { GuiEvent e = m_global_events [event_n]; el_name = e.el_name

以下是原始函数:

    public  static  void GetEvent ( int event_n, ref  string el_name, ref  int id,   ref  long lparam, ref  double dparam, ref  string sparam)
    {         
            GuiEvent e = m_global_events [event_n];
            el_name = e.el_name;
            id = ( int ) e.id;
            lparam = e.lparam;
            dparam = e.dparam;
            sparam = e.sparam;

    }
以下是我尝试过的:

public  static  void GetEvent ([MarshalAs (UnmanagedType.I4)] int event_n, [MarshalAs (UnmanagedType.LPTStr)] ref  string   el_name, [MarshalAs (UnmanagedType.I4)] ref  int id, [MarshalAs (UnmanagedType.I8)] ref  long lparam, [MarshalAs (UnmanagedType.R8)] ref  double dparam, [MarshalAs (UnmanagedType.LPTStr)] ref  string sparam)
        {
            GuiEvent e = m_global_events [event_n];
            el_name = e.el_name;
            Console.WriteLine (e.el_name);
            id = ( int ) e.id;
            lparam = e.lparam;
            dparam = e.dparam;
            sparam = e.sparam;
        }
我得到一个错误:

Access violation  
请让我知道我能做些什么使它与MQL4一起工作

Dll访问如下所示:

#import    "my.dll"  
void GetEvent ( int index, string element_name, int elemnet_id, long element_lparam, double element_dparam, string element_sparam);
#import

我想我可以解决你的问题。
在这里:
首先,让我们修复C#Dll函数:
它必须是这样的:

[DllExport("GetEvent", CallingConvention = CallingConvention.StdCall)]
public static void GetEvent([MarshalAs(UnmanagedType.I4)] int event_n, [In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder el_name, [In, Out, MarshalAs(UnmanagedType.I4)] ref int el_id,
    [In, Out, MarshalAs(UnmanagedType.I8)]ref long lparam, [In, Out, MarshalAs(UnmanagedType.R8)]ref double dparam, [In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder sparam)
{
    GuiEvent e = m_global_events[event_n];
    _ = el_name.Replace("-1", e.el_name);
    el_id = (int)e.id;
    lparam = e.lparam;
    dparam = e.dparam;
    _ = sparam.Replace("-1", e.sparam);
}
void OnInit()
{
string name="-1", sparam="-1";
      int id;
      long lparam;
      double dparam;
      GetEvent(0, name, id, lparam, dparam, sparam);
      PrintFormat("name: %s, id: %d, lparam: %ld, dparam: %lf, sparam: %s",name, id, lparam, dparam, sparam);
}
现在,在修复C#函数之后,让我们改进您的MQL4:

#import    "my.dll"  
void GetEvent ( int index, string &element_name, int &elemnet_id, long &element_lparam, double &element_dparam, string &element_sparam);
#import
现在,要访问这些值,您必须使用如下方式调用函数:

[DllExport("GetEvent", CallingConvention = CallingConvention.StdCall)]
public static void GetEvent([MarshalAs(UnmanagedType.I4)] int event_n, [In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder el_name, [In, Out, MarshalAs(UnmanagedType.I4)] ref int el_id,
    [In, Out, MarshalAs(UnmanagedType.I8)]ref long lparam, [In, Out, MarshalAs(UnmanagedType.R8)]ref double dparam, [In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder sparam)
{
    GuiEvent e = m_global_events[event_n];
    _ = el_name.Replace("-1", e.el_name);
    el_id = (int)e.id;
    lparam = e.lparam;
    dparam = e.dparam;
    _ = sparam.Replace("-1", e.sparam);
}
void OnInit()
{
string name="-1", sparam="-1";
      int id;
      long lparam;
      double dparam;
      GetEvent(0, name, id, lparam, dparam, sparam);
      PrintFormat("name: %s, id: %d, lparam: %ld, dparam: %lf, sparam: %s",name, id, lparam, dparam, sparam);
}
我希望这对你有帮助。以下是一些参考资料,将在将来帮助您: 参考文献: