0

我需要手动处理实际的加载/卸载git2.dll,而不是[DllImport("git2")]在 C# 中使用。我似乎在创建一个IntPtr用于引用存储在libgit2.

这是我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在对发生这种情况的原因进行了更多研究之后,根据This Post以及我在寻找修复程序时遇到的其他几个问题,似乎这些函数可能无法使用extern "C"或可能未使用.def文件导出。

我确实查看了一些libgit2代码,我看到extern在几个函数上使用了,但在其他函数上我根本没有看到 export 关键字,但它们仍然可以从LigGit2Sharp'sNativeMethods.cs类的外部访问。

虽然所有这些对我来说都是陌生的,但我确实找到了一篇非常有用的帖子,内容是关于附带的工具,该工具Visual Studio可让您查看所有导出的项目及其名称:Dumpbin。有了这个,我能够确定导出的名称,并使用/OUT:filename标志将它们保存到文件中:PasteBin

使用我可以使用的所有导出名称,我只需要遵循我实际使用的函数调用,并将方法替换为NativeMethods.cs如下所示:LibGit2Sharp Issue #341

于 2013-02-19T17:17:04.393 回答