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

在我的工作场所,我主要使用 C# 进行编程。
我们有这个与我们合作的 3rd 方公司,它为我们提供了一个我们需要使用的 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# DllImport 麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4426669/

10-13 06:22