从c# dll调用/封送字符串到非托管代码
本文关键字:字符串 非托管代码 dll 调用 | 更新日期: 2023-09-27 17:49:46
我正在尝试从非托管第三方应用程序metatrader调用dll中的c#函数
我遵循了从非托管代码调用c# dll的建议,但是,关于封送字符串的示例不起作用。
注意:我已经成功地从参考(函数"添加")中调用了整数加法示例,它可以端到端工作,没有问题,所以我知道问题与字符串有关。即,"ReplaceString"函数不起作用。我也看过robertgisiecke的网站,但是那里没有字符串的例子,或者我太笨了,弄不清楚。
我在metatrader中得到的错误信息是:15:27:40 2009.11.10 00:01 MT4LibTest EURUSD,H1:从dll' Testme.dll'调用函数'ReplaceString'严重错误c0000005 at 040B031B.
平台是Windows Server 2012(64位),我已经编译到x86,因为Metatrader是x86程序
还有一件事:我对VS世界不是很有经验,所以我希望有人能好心帮助我
谢谢c#代码:
[DllExport("ReplaceString", CallingConvention = CallingConvention.StdCall)]
public static int ReplaceString(
[In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder str,
[MarshalAs(UnmanagedType.LPWStr)]string a,
[MarshalAs(UnmanagedType.LPWStr)]string b)
{
str.Replace(a, b);
if (str.ToString().Contains(a)) return 1;
else
return 0;
}
调用函数(Metatrader):
#import "MT4Lib.dll"
int ReplaceString(string & str,string a,string b);
int Add(int x, int y);
#import
string str="A quick brown fox jumps over the lazy dog";
string stra = "fox";
string strb = "cat";
Print(str);
Print(ReplaceString(str,stra,strb));
Print(str);
编辑:我应该澄清的是,允许编写"脚本"的metatrader API不允许完整的c++类型。没有char,没有wchar当然也没有指向这些类型的指针。只有"字符串"。
找到解决方案!
首先,感谢所有回复我的人。掌握新技术(对我来说)有点挑战性。@Jim:查看我添加的编辑。MQL (metatrader语言)可以基于c++,但已经被应用程序的设计者严重地束缚住了。所以没有wchar类型。@Simon:添加对NuGet包"UnmanagedExports"的引用将为你放置包装器和处理CIL修复,这样你就可以专注于你的代码。我在问题中包含的链接详细说明了这一点。
这段代码有两个问题:在给出的示例代码中,c#函数中的字符串参数被声明为LPWStr(宽字符串)。在调试器中查看它们,发现里面有类似中文的字符。
public static int ReplaceString( [In, Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder str, [MarshalAs(UnmanagedType.LPStr)]string a, [MarshalAs(UnmanagedType.LPStr)]string b)
示例代码也有一个指向string的指针,在调用者(本机)代码中声明为参数。删除这个,并使用StringBuilder类来更改托管c#代码中的字符串,工作了。
#import "MT4Lib.dll" int ReplaceString(string str,string a,string b); int Add(int x, int y); #import