1

我已经使用包含的解决方案文件将libsass 3.3.6编译成带有 VS 2015 的 DLL 。运行下面的代码会导致程序立即崩溃而没有输出。

using System;
using System.Runtime.InteropServices;

namespace Sass.Cli {
static class Sass {
    [DllImport(@"C:\...\libsass\win\bin\libsass.dll")]
        public static extern String libsass_version();
    }
    class Program {
        static void Main(string[] args) {
            Console.WriteLine(Sass.libsass_version());
        }
    }
}

调用函数的来源位于sass.cpp:61

const char* ADDCALL libsass_version(void)

DLL 和上面的代码都是为 x86 编译的。在崩溃时运行 VS 调试器会给我以下异常:Sass.Cli.exe 中 0x771A9841 (ntdll.dll) 处的未处理异常:0xC0000374:堆已损坏(参数:0x771DC8D0)。

这是可以修复的还是我忽略的?或者仅仅是libsass DLLs当前不工作的情况?

4

1 回答 1

4

当 astring用作返回类型时,框架假定它是通过调用分配的CoTaskMemAlloc。然后它通过调用复制字符串的内容和释放CoTaskMemFree。这就是你的错误的解释。

通过将返回值更改为IntPtr并获取字符串内容来解决它Marshal.PtrToStringAnsi。您无需处理任何已定位的内容,因为此版本字符串将是静态的。

我不知道调用约定是什么。您应该检查代码和文档以找出答案。尽管如此,这个函数非常简单,以至于它对 cdecl 和 stdcall 的行为方式相同,因此无法解释错误。尽管如此,您仍需要为图书馆的其余部分做好准备。

请注意,我在这里猜测了一下。你没有提供完整的细节。您应该查阅代码和文档以仔细检查我的猜测。

于 2016-09-25T16:52:43.557 回答