使用libgit2sharp和LINQPad?

6
我使用的LINQPad版本带有NuGet,我添加了libgit2sharp,但该库依赖于另一个(本地)dll。我尝试过以下方法:
- 将它们复制到我的系统目录中。 - 将它们放在一个单独的目录中,并将其添加到路径中。 - 将它们放在LINQPad的插件目录中。 - 当运行查询时将它们复制到Assembly.GetExecutingAssembly().Location
我只是想用这个库读取日志,在LINQPad中把它作为代码片段会很方便,虽然如果其他方法失败,我想我可以把它做成控制台应用程序。有没有人使用过libgit2sharp和LINQPad,并能解释如何使它们协同工作?

LinqPad 有错误吗?我不太确定你遇到了什么问题。 - Dustin Kingen
1
是的,无法加载 DLL 'git2-9d9fff3'(这是我在测试中复制的那个)。 - Don
6个回答

7
将dll文件放入路径中的文件夹或将dll文件所在位置添加到路径中应该可以解决问题(对我而言已经可行)。也许您的更改尚未生效。尝试关闭并重新打开LinqPad,如果失败,请注销并重新登录Windows。

我感觉很蠢。我把dll文件复制到了一个路径目录中,我一直都保存了UnxUtils、sysinternals二进制文件等等。我只是假设如果这样做可以的话,LINQPad就会找到它,但是需要重新启动LINQPad才行。非常感谢。 - Don

5

编辑: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包,该包包括预期位置下的本机二进制文件(NativeBinaries\x86\git2-785d8c4.dll和NativeBinaries\amd86\ git2-785d8c4.dll) - 下载示例LibGit2Sharp 0.21.0.176。

1
谢谢Joe。由于某种原因,我的LinqPad似乎从“TEMP”文件夹中运行查询。这意味着当获取NuGet根时,它会出现“InvalidOperationException: Sequence contains more than one matching element”的错误。当我将此行更改为以下内容时,它可以正常工作:var nugetRoot = new DirectoryInfo(Path.Combine(localAppData, "LINQPad", "NuGet.FW46")); - Kevin Kuszyk
这又坏了吗?我正在尝试使用LINQPad 5.36.03和LibGit2Sharp 0.26,但出现了“DllNotFoundException”的错误。 - Mark Heath
2
是的,最新的libgit2sharp在LINQPad 5中已经无法使用了。解决方法是下载0.25.4版本或更早版本。好消息是,在.NET Core下,它将可以在LINQPad 6中再次工作。 - Joe Albahari

3
我最终使用以下方式在运行时添加相关路径:
void SetUpNativeBinaries(){
    var appDataLocal = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
    var packageVersion = "LibGit2Sharp.0.14.0.0";// may read from PackageInfo
    var processorArchitecture = IntPtr.Size==8?"amd64":"x86";
    var libgitNativeBinaryPath = Path.Combine(appDataLocal, "LINQPad", "NuGet", "LibGit2Sharp", packageVersion, "NativeBinaries", processorArchitecture);
    libgitNativeBinaryPath.Dump();

    var pathEnvVariable = "PATH";
    var currentPaths = Environment.GetEnvironmentVariable(pathEnvVariable);
    var combinedPaths = String.Format(
        System.Globalization.CultureInfo.InvariantCulture,
        "{0}{1}{2}",
        libgitNativeBinaryPath,
        Path.PathSeparator,
        currentPaths);

    Environment.SetEnvironmentVariable(pathEnvVariable, combinedPaths);
}

将其保存为“C#程序”,您可以立即开始:
void Main()
{
    SetUpNativeBinaries();
    var repoWorkingDir = @"C:\temp\libgit2_repo";
    var repo = new Repository(repoWorkingDir);

    repo.Config.Dump();
    repo.Branches.Dump();
    repo.Index.RetrieveStatus().Dump();
    //...
}

更新此问题已经被解决,并在版本0.14.1.0中发布修复程序。


3

了不起的 @mbx 站起来并 帮助我们实现了这一点

多亏了他,下一个版本的 LibGit2Sharp NuGet 包 (v0.15.0) 将直接在 LinqPad 中工作。

更新:

LibGit2Sharp NuGet v0.14.1 包含此修复程序,现在可以下载使用


LibGit2Sharp NuGet软件包的0.22.0版本在LINQPad 5.08.01版本中无法运行。 - Kenny Evitt

2

对于LibGit2Sharp NuGet包的版本0.22.0和LINQPad的版本5.08.01,既有NuGet包本身也不适用于我。mbx的回答也没有帮助我解决问题。

我修改了mbx回答中的方法如下:

void SetUpLibGit2SharpNativeBinaries()
{
    string libGit2SharpNativeBinariesPath = @"C:\Users\kevitt\AppData\Local\LINQPad\NuGet.FW46\LibGit2Sharp\LibGit2Sharp.NativeBinaries.1.0.129\libgit2\windows\x86";

    string pathEnvVariable = "PATH";
    string currentPaths = Environment.GetEnvironmentVariable(pathEnvVariable);

    IEnumerable<string> paths = currentPaths.Split(';');

    if (!paths.Contains(libGit2SharpNativeBinariesPath))
    {
        var combinedPaths = String.Format(
            System.Globalization.CultureInfo.InvariantCulture,
            "{0}{1}{2}",
            libGit2SharpNativeBinariesPath,
            Path.PathSeparator,
            currentPaths);

        Environment.SetEnvironmentVariable(pathEnvVariable, combinedPaths);
    }
}

请注意,这几乎肯定不会对其他人起作用,因为您至少需要将我的Windows登录名替换为自己在字符串变量libGit2SharpNativeBinariesPath中分配的值。
此外,libGit2SharpNativeBinariesPath(对应于mbx代码中的libgitNativeBinaryPath字符串)似乎现在不是可以像mbx代码中那样轻松生成的内容,因此您可能需要自行确定路径。

1
C:\Users\kevitt\AppData\Local 替换为 %LOCALAPPDATA% 应该使脚本更通用。但是,您仍将硬编码到 LibGit2Sharp.NativeBinaries 的固定版本上。我刚刚将 %LOCALAPPDATA%\LINQPad\NuGet.FW46\LibGit2Sharp\LibGit2Sharp.NativeBinaries.1.0.129\libgit2\windows\x86 添加到了我的 PATH 中,这似乎解决了问题。 - Kevin Kuszyk
@KevinKuszyk,我实际上尝试了你的建议,但它并不起作用。你能否自己试一下? - Kenny Evitt
1
所以现在我很困惑。这个上周还能用,但今天又坏了。我会再调查一下,有了进展就会更新。 - Kevin Kuszyk
我正在取得进展。在LinqPad中,似乎%LOCALAPPDATA%无法正常工作,但是var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)可以。 - Kevin Kuszyk
@KevinKuszyk 正如Joe Albahari在他的评论中提到的那样,他将在LINQPad中“修复”这个问题;更多细节请参见此处。 - Kenny Evitt
是的,我今天早上看到了。我已经将Joe的解决方法添加到我们的脚本中。当新版本的LinqPad发布时,我会将其删除。 - Kevin Kuszyk

0

对我有用:将git2-785d8c4.dll复制到与LibGit2Sharp.dll相同的目录中,然后重新启动LINQPad。

copy %LOCALAPPDATA%\LINQPad\NuGet.FW46\LibGit2Sharp\LibGit2Sharp.NativeBinaries.2.0.267\runtimes\win-x86\native\git2-785d8c4.dll %LOCALAPPDATA%\LINQPad\NuGet.FW46\LibGit2Sharp\LibGit2Sharp.0.26.0\lib\net46

(LibGit2Sharp.0.26.0,LINQPad 5.36.03)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接