gpt4 book ai didi

C# Dll导入麻烦

转载 作者:行者123 更新时间:2023-11-30 12:16:57 28 4
gpt4 key购买 nike

我的问题有点笼统,所以我不是在寻找一个确切的答案,但可能一些研究方向会帮助我......

在我的工作场所,我主要使用 C# 进行编程。我们有与我们合作的第 3 方公司,它为我们提供了我们需要使用的 native C++ dll。由于我需要的 C++ 方法没有以易于从 C# 引用的方式公开,因此我将该 dll 包装在另一个 native C++ Dll 中。

所以现在我有 2 个 native 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 应用程序时(因为这是我真正需要它的地方),我发现我收到的字符串是垃圾,甚至不一致。似乎我只是得到了一些对丢失的内存或类似东西的引用,但这只是我的猜测......

我不知道为什么会这样,因为在我的控制台应用程序中一切正常。

有没有人有可能帮助我的方向???...

提前致谢,吉利布

编辑:我认为这可能与一些未固定的对象有关,所以我尝试在固定语句中调用该方法,例如:

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);

我要查找的返回值放在*hashPass参数中。

现在,我创建了一个简单的控制台应用程序来测试它。当在我的主类中插入 DllImport 并直接调用该方法时,一切都很好,但是当我移动 DllImport 并将该方法包装在另一个类中并从控制台“Main”方法调用该类时,我得到一个 StackOverflow 异常!

有人知道为什么会这样吗??

最佳答案

尝试 specifying the capacity of the StringBuilder在将其传递给您的互操作方法之前。

关于C# Dll导入麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426669/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com