我的问题是有点一般,所以我不是在寻找一个确切的答案,但可能还有一些方向考虑,这将有助于我...C#的DllImport麻烦
在我工作的地方我编程主要是在C#。 我们有这个第三方公司,这给了我们一个我们需要使用的Native C++ dll。由于我需要的C++方法没有以易于从C#引用的方式公开,所以我将dll封装在另一个本机C++ Dll中。
所以,现在我有2倍本机C++的DLL中,一个包裹其他。
我创建的调用我在C++中创建的方法的小C#控制台应用程序。 我的方法签名如下所示:
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
在我的控制台应用程序,一切工作正常,我总是收到串IM在结果期待。
但是,当我将它移动到一个Web服务或我创建了一个Web应用程序(因为这是我真的需要它),我看到字符串IM接收就是垃圾,甚至并不一致。看来,如果即时得到只是一些参考对丢失或类似的东西的内存,但是这仅仅是我的猜测......
我不知道为什么会这样,因为在我的控制台应用程序一切正常精细。
没有人有可能会帮助我一个方向??? ...
由于提前, gillyb
编辑: 我想这可能与一些未锁定的对象做,所以我试图在固定的声明中调用方法,如:
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;
}
...但这仍然没有为我做。这是固定物体的正确方法吗?
第二编辑: 在C++中的方法,签名看起来像这样:
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
第三编辑: 我改变的方法的签名是
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
和返回值im寻找放在*hashPass
参数。
现在,我创建了一个简单的控制台应用程序来测试它。当将DllImport插入到我的主类中,并直接调用该方法时,一切都很好,但是当我移动DllImport并将该方法包装在不同的类中并从Console'Main'方法中调用该类时,出现StackOverflow异常!
任何人有任何想法,为什么发生这种情况?
您能告诉我们如何在C/C++中声明函数头吗?这可以帮助:) – 2010-12-13 09:11:15
杀死API的作者,有一个非常明显的内存泄漏发生... – leppie 2010-12-13 10:37:47
为什么?你能解释一下为什么,以及为什么从签名中如此清楚?希望我们仍然可以解决它! – gillyb 2010-12-13 10:41:32