Jak wymusić korzystanie z .dll w innej lokalizacji niż sama aplikacja

0

Witam.
Kolejne pytanie z serii głupich. Oczywiście tyczy się to Comarch Optima, ale to ma (chyba) najmniejsze znaczenie. Piszę sporo dodatków do Optimy, jak już pewnie się zorientowaliście i niestety DDLki Optimowe zmuszają mnie do instalowania swojej aplikacji w folderze z Optimą. Niektórzy klienci mają już tak bardzo nawalone moimi exekami, że aż mi źle z tym syfem.
Comarch często w dokumentacji wspominał, że trzeba ustawić Environment.CurrentDirectory na folder z Optimą i będzie działać, nie działa. Znalazłem jeszcze opcję Directory.SetCurrentDirectory, wartość jest zmieniona, ale moja aplikacja wciąż marudzi, że nie może znaleźć pliku .dll.

Czy jest opcja, aby powiedzieć aplikacji, z którego folderu ma korzystać podczas pracy, a ona sama znajdowała się kompletnie w innym miejscu?

0

Kompletnie nic nie rozumiem z tej dokumentacji. Czy ktoś jest w stanie mi pokazać na przykładzie? Czy to znaczy, że wszystkie dll muszę ładować w ten sposób, aby z nich skorzystać? Czy jest szansa, aby zwyczajnie dodać pliki .dll do projektu jako referencja ale ich ścieżka jest gdzieś indziej na dysku?

4

Referencje dodajesz normalnie do projektu, natomiast po instalacji mogę być dll umieszczone gdziekolwiek, przykład:

public static bool Foo()
{                                 
    try
    {
        AppDomain.CurrentDomain.AssemblyResolve += ResolveEventHandler;

        RunCodeThatNeedsDLLFromDifferentPath();
        
    }
    finally
    {
        AppDomain.CurrentDomain.AssemblyResolve -= ResolveEventHandler;
    }

    return result;
}



private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
{
    string assemblyName = args.Name.Split(',').FirstOrDefault();

    string currentPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

    switch (assemblyName)
    {
        case "Foo_X64":
            string path = Path.Combine(currentPath, "x64//Foo.dll");
            if (File.Exists(path))
            {
                var loadedAssembly = Assembly.LoadFrom(path);
                return loadedAssembly;
            }
            break;
    }

    return null;
}
0

Myślałem, że jedyne wyjście to ładowanie .dll "ręcznie". Działa, dzięki wielkie.

0
AdamWox napisał(a):

Niektórzy klienci mają już tak bardzo nawalone moimi exekami, że aż mi źle z tym syfem.

Nie rozumiem – na pulpicie te exeki trzymają? Wszystkie pliki exe i dll aplikacji powinny być „gdzieś tam” (w jednej z zalecanych przez MS lokalizacji) a na pulpicie czy w menu start tylko skróty.

Zobacz że takie Visual Studio czy Office mają wiele różnych plików (w tym exe i dll) i jakoś nie jest to problemem.

0

To nie o to chodzi. Jeśli podpinam referencje do plików z Optimy, aby skorzystać sobie z jakiś tam funkcji to czy w debug czy release aplikacja szuka tych plików .dll w miejscu, w którym się znajduje .exe. Z tego właśnie powodu, wszystkie dodatkowe aplikacje pod Comarch Optima wklejałem do folderu z Optimą, ponieważ tam te pliki .dll są. Część z nich jest wywoływana za pomocą "Funkcji dodatkowych", a część z nich jest uruchamiana bezpośrednio z .exe. Czy był skrót na pulpicie, czy nie, pliki exe (fizycznie) musiały być w folderze z Optimą, aby poprawnie działać.

Dzięki temu rozwiązaniu jestem w stanie instalować każdą aplikację w osobnym folderze, na przykład w Program Files, nie śmiecąc folderu Optimowego. Druga sprawa, czasem korzystam z .dll, z których korzysta Optima i często je nadpisuje, aby moja aplikacja działała, np.: Newtonsoft.Json.dll

1 użytkowników online, w tym zalogowanych: 0, gości: 1