我需要手动处理实际git2.dll
的加载/卸载,而不是在C#中使用[DllImport("git2")]
。我似乎在创建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
本机钩子中存在的各种方法,但它们总是返回零。
答案 0 :(得分:0)
git2.dll
似乎已经破坏了导出名称,因此git_repository_open
实际上是_git_repository_open@4
。研究一些关于为什么发生这种情况后,它似乎是,根据我碰到的同时寻找修复This Post,和其他几个人,该功能可能无法使用导出extern "C"
或者可能没有使用.def
文件。
我确实查看了一些libgit2
代码,我看到extern
用于几个函数,但在其他函数中我根本看不到导出关键字,但它们仍在外部访问来自LigGit2Sharp
的{{1}}课程。
虽然所有这些对我来说都很陌生,但我确实找到了一篇关于NativeMethods.cs
附带的工具的非常有用的帖子,它允许您查看所有导出的项目及其名称:Dumpbin。通过这个,我能够确定导出的名称,并使用Visual Studio
标志将它们保存到文件中:PasteBin
使用我可以使用的所有导出名称,我只需要跟踪我实际使用的函数调用,并将/OUT:filename
中的方法替换为如下所示:LibGit2Sharp Issue #341