Используете libgit2sharp с LINQPad?

У меня есть версия LINQPad с NuGet, и я добавляю libgit2sharp, но это зависит от другой (родной) dll.

Я пробовал:

  • Копирую их в свой системный каталог.
  • Поместите их в отдельный каталог, который я добавил к пути.
  • Поместите их в каталог плагинов LINQPads.
  • Скопируйте их, когда я запрошу Assembly.GetExecutingAssembly().Location

Я просто пытаюсь прочитать журнал с помощью этой библиотеки, и было бы неплохо иметь его как фрагмент в LINQPad, хотя я полагаю, что мог бы сделать его консольным приложением, если все остальное не помогло.

Кто-нибудь использовал libgit2sharp с LINQPad и может объяснить, как заставить их хорошо играть вместе?


person Don    schedule 07.06.2013    source источник
comment
Есть ли ошибка LinqPad? Я не совсем понимаю, какая у вас проблема.   -  person Dustin Kingen    schedule 07.06.2013
comment
Да, не удалось загрузить DLL 'git2-9d9fff3' (ту, которую я скопировал в своих тестах)   -  person Don    schedule 07.06.2013


Ответы (6)


Помещение dll в папку, которая находится на вашем пути, или добавление местоположения вашей dll к вашему пути должно работать (и работает для меня)

Возможно, ваши изменения не вступили в силу. Попробуйте закрыть и снова открыть LinqPad или, если это не поможет, выйдите из системы и снова войдите в Windows.

person sgmoore    schedule 07.06.2013
comment
Я чувствую себя глупо. Я скопировал dll в один из своих каталогов, где я всегда хранил UnxUtils, двоичные файлы sysinternals и т. Д. Просто предполагал, что LINQPad найдет его, если это сработает, но требовался перезапуск LINQPad. Огромное спасибо. - person Don; 07.06.2013

РЕДАКТИРОВАТЬ: LINQPad снова поддерживает LibGit2Sharp из коробки (с LINQPad 5.10.02 - в бета-версии на момент написания). Никаких обходных путей теперь не требуется.

К сожалению, в LibGit2Sharp v0.22 это снова не работает. Этот пакет больше не содержит собственных двоичных файлов в подпапке ниже, где LibGit2Sharp.dll находится в / libs. Вместо этого они находятся в отдельном зависимом пакете 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);
   }
}

Обратите внимание, что вам не нужно явно вызывать этот метод, потому что он находится в статическом конструкторе.

Другой обходной путь - опубликовать другой пакет LibGit2Sharp на NuGet, который включает собственные двоичные файлы в ожидаемых местах, где находится LibGit2Sharp.dll (NativeBinaries \ x86 \ git2-785d8c4.dll и NativeBinaries \ amd86 \ git2-785d8c4.dll) - скачать LibGit2Sharp 0.21.0.176 для примера.

person Joe Albahari    schedule 09.10.2016
comment
Спасибо, Джо. По какой-то причине мой LinqPad выполняет запрос из папки TEMP. Это означает, что он взорвался с InvalidOperationException: Sequence contains more than one matching element. при получении корня NuGet. Когда я меняю эту строку на эту, она работает: var nugetRoot = new DirectoryInfo(Path.Combine(localAppData, "LINQPad", "NuGet.FW46")); - person Kevin Kuszyk; 10.10.2016
comment
Это снова сломано? Я пытаюсь использовать LINQPad 5.36.03 с LibGit2Sharp 0.26 и получаю DllNotFoundException - person Mark Heath; 25.04.2019
comment
Да, последняя версия libgit2sharp в LINQPad 5 не работает навсегда. Обходной путь - загрузить версию 0.25.4 или более раннюю. Хорошей новостью является то, что он снова будет работать в LINQPad 6 под .NET Core. - person Joe Albahari; 27.04.2019

Удивительный @mbx встал и помог нам в этом .

Благодаря ему следующая версия пакета NuGet LibGit2Sharp (v0.15.0) будет работать напрямую из LinqPad.

Обновлять:

Пакет LibGit2Sharp NuGet v0.14.1 содержит это исправление и теперь является доступно для загрузки.

person nulltoken    schedule 21.09.2013
comment
Версия 0.22.0 пакета NuGet LibGit2Sharp не работает в версии 5.08.01 LINQPad. - person Kenny Evitt; 05.10.2016

В итоге я добавил связанный путь во время выполнения, используя:

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

person mbx    schedule 18.09.2013

Ни пакет NuGet как есть, ни ответ mbx не работали для меня для версии 0.22.0 пакета NuGet LibGit2Sharp и версии 5.08 .01 из LINQPad.

Я изменил метод в ответе 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 (соответствующий строке libgitNativeBinaryPath в коде mbx) теперь не похоже на то, что можно (легко) сгенерировать, как в коде mbx, поэтому вам может потребоваться определить путь самостоятельно.

person Kenny Evitt    schedule 05.10.2016
comment
Замена C:\Users\kevitt\AppData\Local на %LOCALAPPDATA% должна сделать сценарий более универсальным. Однако вы по-прежнему будете жестко запрограммированы на фиксированную версию LibGit2Sharp.NativeBinaries. Я только что добавил %LOCALAPPDATA%\LINQPad\NuGet.FW46\LibGit2Sharp\LibGit2Sharp.NativeBinaries.1.0.129\libgit2\windows\x86 в свой PATH, и, похоже, это помогло. - person Kevin Kuszyk; 07.10.2016
comment
@KevinKuszyk Я действительно попробовал ваше предложение, но оно не работает. Не могли бы попробовать сами? - person Kenny Evitt; 07.10.2016
comment
Так что теперь я в замешательстве. Это сработало на прошлой неделе, но сегодня снова не работает. Я изучу еще немного и опубликую обновление, когда оно у меня будет. - person Kevin Kuszyk; 10.10.2016
comment
Я добиваюсь прогресса. Кажется, %LOCALAPPDATA% не работает в LinqPad, но var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) работает. - person Kevin Kuszyk; 10.10.2016
comment
@KevinKuszyk Как Джо Альбахари упомянул в своем комментарии к вам на его ответ на этот вопрос, он собирается «исправить» это в LINQPad; подробнее здесь. - person Kenny Evitt; 10.10.2016
comment
Да, я видел это сегодня утром. Я добавил в наши сценарии обходной путь Джо. Я уберу его, когда выйдет новая версия LinqPad. - person Kevin Kuszyk; 10.10.2016

У меня сработало: скопируйте 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)

person agentnega    schedule 13.06.2019