在我的工作场所,我主要使用C#进行编程。 我们与一家第三方公司合作,并获得了一个本机C++ dll文件,我们需要使用它。 由于我需要的C++方法没有以易于从C#引用的方式暴露出来,因此我将dll封装在另一个本机C++ Dll中。
现在我有两个本机C++ dll文件,其中一个封装了另一个。
我创建了一个小型C#控制台应用程序,调用我在C++中创建的方法。 我的方法签名如下:
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
在我的控制台应用程序中,一切正常,我总是能够在结果中接收到我期望的字符串。但是当我将它移到我创建的 Web 服务或 Web 应用程序中(因为这就是我真正需要它的地方),我发现我接收到的字符串是垃圾,而且不一致。好像我只是得到了一些已经丢失的内存引用之类的东西,但这只是我的猜测......我不知道为什么会发生这种情况,因为在我的控制台应用程序中一切都正常。有没有人可以给我指点一下呢?谢谢!编辑:我认为可能与一些未固定的对象有关,所以我尝试在一个 fixed 语句中调用该方法,例如:
unsafe public static string CreateHashWrap(string pass)
{
String bb;
StringBuilder outPass = new StringBuilder();
fixed (char* resultStr = CreateHash(pass, outPass))
{
bb = new String(resultStr);
}
return bb;
}
...但这对我来说仍然不够。这是固定对象的正确方法吗?
第2次编辑:在C++中,方法签名看起来像这样:
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
第三次编辑: 我将该方法的签名更改为
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
我需要翻译的内容是:and the return value im looking for is placed in the *hashPass参数。
现在,我创建了一个简单的控制台应用程序来测试它。当我将DllImport插入到我的主类中,并直接调用该方法时,一切都很顺利。但是,当我将DllImport移动并将该方法包装在不同的类中,并从控制台的'Main'方法调用该类时,我会得到一个StackOverflow异常!
有人有任何想法为什么会发生这种情况吗?