0

C#git2.dllで使用する代わりに、実際の のロード/アンロードを手動で処理する必要があります。に格納されているメソッドのアドレスへの参照用の[DllImport("git2")]作成に問題があるようです。IntPtrlibgit2

PluginManagerこれは、ライブラリの手動ロード、マーシャリング/デリゲート (このキンクを修正したときはいつでも)、およびアンロードを容易にするのに役立つと思われる、私のクラスの良い部分です。

public class PluginManager {
    public const string LIB = "Assets\\Plugins\\git2.dll";

    [DllImport( "kernel32.dll", CharSet = CharSet.Ansi )]
    public static extern IntPtr LoadLibrary( [In, MarshalAs( UnmanagedType.LPStr )] string lib );

    [DllImport( "kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true )]
    public static extern IntPtr GetProcAddress( [In] IntPtr reference, [In, MarshalAs( UnmanagedType.LPStr )] string method );

    [DllImport( "kernel32.dll" )]
    public static extern bool FreeLibrary( [In] IntPtr reference );
}

ここで私はそれらを使用しようとしています:

//# Working; always non-zero.
IntPtr reference = PluginManager.LoadLibrary( PluginManager.LIB );

//# Should be valid -- LibGit2Sharp.Core.NativeMethods.cs calls this method, too.
//# Always returns IntPtr.Zero.
IntPtr methodReference = PluginManager.GetProcAddress( reference, "git_repository_open" );

ライブラリはこのタイプの読み込みにさらされていませんか? LibGit2Sharpネイティブ フックに存在するすべての種類のメソッドを試しましたが、常にゼロが返されます。

4

1 に答える 1

0

git2.dllエクスポート名が壊れているように見えますが、git_repository_open実際にはそうです_git_repository_open@4。なぜこれが起こっているのかをさらに調査した後、この投稿、および修正を探しているときに遭遇した他のいくつかによると、関数がファイルextern "C"を使用してエクスポートされていないか、使用されていない可能性があるよう.defです。

libgit2一部のコードを調べたところ、いくつかのextern関数で使用されていることがわかりましたが、他の関数では export キーワードがまったく見られませんでしたが、クラスから外部からアクセスされていLigGit2SharpますNativeMethods.cs

Visual Studioこれらはすべて私にはなじみのないものですが、エクスポートされたすべてのアイテムとその名前を表示できる同梱のツールに関する非常に役立つ投稿を見つけました: Dumpbin。これにより、エクスポートされた名前を特定でき、/OUT:filenameフラグを使用してそれらをファイルに保存できました: PasteBin

エクスポートされたすべての名前を自由に使用できるので、実際に使用している関数呼び出しに従って、メソッドを次のNativeMethods.csように置き換える必要があります: LibGit2Sharp Issue #341

于 2013-02-19T17:17:04.393 に答える