编辑:LINQPad 再次支持开箱即用的 LibGit2Sharp(截至 LINQPad 5.10.02 - 在撰写本文时处于测试阶段)。现在不需要变通方法。
不幸的是,这在 LibGit2Sharp v0.22 中再次被打破。此软件包不再包含位于 /libs 中 LibGit2Sharp.dll 下的子文件夹中的本机二进制文件。相反,它们位于一个单独的依赖 NuGet 包中,该包依赖于修补项目文件。由于 LINQPad 不使用项目文件,因此失败。
您可以通过添加其他答案中建议的初始化方法来解决此问题,以使用本机文件夹位置填充 PATH 变量。以下代码无需修改即可在具有当前 LibGit2Sharp 的任何机器上运行:
void Main()
{
... your query here...
}
static UserQuery()
{
const string pathEnvVariable = "PATH";
char slash = Path.DirectorySeparatorChar;
char pathSep = Path.PathSeparator;
// The correct native binary file is located under a folder ending in
// "windows\x86" or "windows\amd64" or "win7-x86\native" or "win7-x64\native".
// This may change in later LibGit2Sharp releases.
string nativeStem1 = $"{slash}windows{slash}{(IntPtr.Size == 8 ? "amd64" : "x86")}";
string nativeStem2 = $"{(IntPtr.Size == 8 ? "-x64" : "-x86")}{slash}native";
// Locate the root folder in the NuGet package. This contains folders for the
// main package (LibGit2Sharp) plus dependencies (LibGit2Sharp.NativeBinaries).
var nugetRoot = new FileInfo (typeof (Repository).Assembly.Location)
.Directory.Parent.Parent.Parent;
var nativeBinaryPath = nugetRoot
.GetFiles ("*.dll", SearchOption.AllDirectories)
.Single (d => d.DirectoryName.EndsWith (nativeStem1, StringComparison.OrdinalIgnoreCase) ||
d.DirectoryName.EndsWith (nativeStem2, StringComparison.OrdinalIgnoreCase))
.Directory
.FullName;
string currentPaths = Environment.GetEnvironmentVariable (pathEnvVariable);
if (!(pathSep + currentPaths + pathSep).ToUpperInvariant().Contains
(pathSep + nativeBinaryPath.ToUpperInvariant() + pathSep))
{
Environment.SetEnvironmentVariable (pathEnvVariable, currentPaths + pathSep + nativeBinaryPath);
}
}
请注意,您不需要显式调用此方法,因为它位于静态构造函数中。
另一种解决方法是在 NuGet 上发布另一个 LibGit2Sharp 包,该包在 LibGit2Sharp.dll 所在的预期位置(NativeBinaries\x86\git2-785d8c4.dll 和 NativeBinaries\amd86\git2-785d8c4.dll)下包含本机二进制文件 - 下载以 LibGit2Sharp 0.21.0.176 为例。