2015-02-02 16 views
7

Mam starą wersję usługi webservice na ASP.NET (przy użyciu .asmx) plików. Potrzebuję używać sodu.net - niestety zawiedzie podczas ładowania zależnego pliku libsodium.dll. Jakieś pomysły na temat tego, co robię źle?Jak dołączyć libsodium.net do ASP.NET

  • Dodałem libsodium.net przez NuGet.

  • Zmieniłem nazwę 64-bitowej biblioteki DLL na "libsodium.dll" (i inne konwencje nazewnicze).

  • Próbowałem odwołać się bezpośrednio do libsodium.dll, ale VS odrzuca go (nie jest prawidłową biblioteką DLL). Dlatego dodałem go jako "treść" zamiast "kopiuj do wyjścia".

  • Po ukończeniu budowy widzę, że folder witryny/Bin zawiera zarówno plik syd.dll (zespół .NET), jak i libsodium.net.

  • Kiedy próbuję użyć libsodium.net uzyskać:

    ERROR 02.02.2015 11: 14: 27,118 13798ms [41] CabinetService doRequest - Caught: Typ inicjator dla '' rzucił Sodium.SodiumCore wyjątek. System.TypeInitializationException: Inicjator typu dla "Sodium.SodiumCore" zwrócił wyjątek. ---> System.DllNotFoundException: Nie można załadować biblioteki DLL 'libsodium.dll': Nie można znaleźć określonego modułu. (Wyjątek HRESULT: 0x8007007e) w DynamicDllInvokeType.sodium_init() w Sodium.SodiumCore..cctor() --- Koniec wewnętrznej śledzenia wyjątku stosu --- w Sodium.SodiumCore.LibraryName() na sodu. SecretBox.Create (Byte [] wiadomość, Byte [] nonce, Byte [] klucz) w Macaroons.SecretBoxCryptoAlgorithm.Encrypt (Byte [] klucz, Byte [] plainText) w c: \ Projects \ Macaroons.Net \ Macaroons.Net \ SecretBoxCryptoAlgorithm.cs: linia 58

Więc to nie może znaleźć "libsodium.dll", mimo że znajduje się w folderze Bin. Próbowałem też usunąć zależność od "sodium.net", gdzie po tym, jak dostałem błąd runtime z napisem "sodium.net" - kiedy ponownie go dodałem, ten błąd zniknął, a zamiast tego dostałem ten jeden (wskazując "sodium.net" ładuje się poprawnie).

Tak więc otwieram folder cień strony w "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Tymczasowe pliki ASP.NET \ cabinetservice" i wyszukaj "sodu". Jedynym wynikiem jest "sodium.dll" w niektórych podfolderach. Nie ma "libsodium.dll".

Najwyraźniej program ASP.NET ignoruje plik "libsodium.dll" podczas tworzenia kopii w tle witryny.

Próbowałem również dodać libsodium.dll (32-bitowy) do C: \ Windows \ System32 i libsodium.dll (64-bitowy) do C: \ Windows \ SysWOW64. Ten sam wynik.

I próbowałem C: \ Windows \ Microsoft.NET \ assembly \ GAC_32 \ libsodium i C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ libsodium. Ten sam wynik.

Jak mogę poinformować program ASP.NET o zależności?

Odpowiedz

16

Okazuje się, że program ASP.NET nie tworzy kopii w tle niezarządzanych bibliotek DLL, takich jak libsodium.dll i libsodium-64.dll.

Sodium.dll (kod zarządzany) próbuje załadować biblioteki DLL z tego samego katalogu, co kopia w tle Sodium.dll (która nie będzie działać) - lub niektóre, gdzie w katalogach zmiennych środowiskowych PATH.

Moje rozwiązanie było dodać katalog AppDomain \ bin do ścieżki przed wywołaniem kodu sodu:

// Make it possible to load unmanaged libsodium DLLs that .NET does not make shadow copies of. 
// -> Simply point the "path" variable to the Bin directory. 
string path = Environment.GetEnvironmentVariable("PATH"); 
string binDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Bin"); 
Environment.SetEnvironmentVariable("PATH", path + ";" + binDir); 

Aktualizacja stycznia 2018 (z odpowiedzią Jordan Rieger):

pamiętać, że mogą również należy zainstalować na serwerze Redystrybucyjny Microsoft Visual C++ 2015 (w zależności od procesu) cel x64 lub x86, ).

Nie zapomnij ponownie uruchomić puli aplikacji (wykonałem reset IIS) po instalacji redystrybucji.

+0

dzięki za zamieszczenie odpowiedzi! – matao

+1

Dodałem ten fragment do Application_Start mojego Global.asax.cs, a to zadziałało dla mojej aplikacji Web Forms. Dodałem libsodium-net przez NuGet. – Reuben

+1

@ Jørn Wildt dzięki za opublikowanie tego, kiedy dodałem go do mojego globalnego uruchomienia aplikacji działało lokalnie. Powiedziałem, że pojawia się ten sam błąd podczas korzystania z mojego publikowania w Internecie na serwerze. :( – Gram

0

Należy pamiętać, że może być konieczne zainstalowanie Microsoft Visual C++ 2015 Redistributable na serwerze (albo cel x64 lub x86, w zależności od procesu).

Nie zapomnij, aby ponownie uruchomić aplikację basen (Zrobiłem reset IIS) po instalacji redystrybucji.

Zobacz mój komentarz na https://stackoverflow.com/a/45078280/284704.

+0

Tak, wpadłem na ten sam problem kilka tygodni temu. –

Powiązane problemy