1

付属のソリューション ファイルを使用して、VS 2015 でlibsass 3.3.6を 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 DLL が現在動作していないだけですか?

4

1 に答える 1

4

astringが戻り値の型として使用される場合、フレームワークは を呼び出すことによって割り当てられたと想定しCoTaskMemAllocます。次に、文字列の内容をコピーし、 を呼び出して割り当てを解除しますCoTaskMemFree。それがあなたのエラーの説明です。

戻り値を に変更しIntPtr、文字列の内容を で取得して解決しMarshal.PtrToStringAnsiます。このバージョン文字列は静的であるため、見つかったものを処理する必要はありません。

呼び出し規約が何であるかわかりません。コードとドキュメントを確認して確認してください。それでも、この関数は非常に単純であるため、cdecl と stdcall の両方で同じように動作するため、エラーを説明できません。それでも、ライブラリの残りの部分を適切に処理する必要があります。

ここで少し推測していることに注意してください。完全な詳細を提供していません。私の推測を再確認するには、コードとドキュメントを参照してください。

于 2016-09-25T16:52:43.557 に答える