2016-09-25 12 views
1

I ’ ve the included solution filesを使用してVS2015を持つDLLにlibsass 3.3.6をコンパイルしました。以下のコードを実行すると、プログラムは出力なしで直ちにクラッシュします。.NET P/Invokeでlibsass関数を呼び出すのが失敗するのはなぜですか?

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用にコンパイルされています。 VSCデバッガをクラッシュで実行すると、次の例外が発生します。Sass.Cli.exeの0x771A9841(ntdll.dll)で未処理の例外が発生しました。0xC0000374:ヒープが破損しました(パラメータ:0x771DC8D0)。

この問題は修正できますか?’は見落とされていますか?または、libsass DLLが現在動作しているのは’なのですか?

答えて

3

戻りタイプとしてstringが使用される場合、フレームワークは、CoTaskMemAllocを呼び出すことによって割り当てられたものとみなします。その後、CoTaskMemFreeを呼び出して文字列の内容と割り当てをコピーします。それがあなたのエラーの説明です。

戻り値をIntPtrに変更し、文字列の内容をMarshal.PtrToStringAnsiに変更して解決します。このバージョンの文字列は静的なものなので、何も配置する必要はありません。

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

ここで私は少し推測しています。あなたは完全な詳細を提供していません。私の推測を再確認するには、コードとドキュメントを参照する必要があります。

+0

出力するバージョンは* [NA] *ですが、これで解決しました。私はそれが完全に無関係であると推測しているので、私はこれを答えとしてマークしています。 –

+0

また、将来、これを明確にするためにさらに詳細な情報がありますか?私は再びP/Invokeの問題にぶつかると確信しています。 –

+0

あなたはADDCALLが何であるかを教えておらず、戻り値のメモリをどのように割り当て解除するかを説明しません。 –

関連する問題