Ссылка плагина Flutter на локальный общий lib не работает (RPATH не работает)

Я нашел причину, по которой решение в http://blogs.msdn.com/b/webdev/archive/2013/10/30/web-publishing-updates-for-app-offline-and -usechecksum.aspx не работает для исходного плаката, и у меня есть обходное решение.

Проблема с подходом EnableMSDeployAppOffline заключается в том, что она только перерабатывает домен приложения, на котором размещается приложение. Он не перерабатывает рабочий процесс пула приложений (w3wp.exe), в котором живет домен приложения.

Срыв и повторное создание домена приложения не повлияет на рассматриваемые SPC-серверы Sql Server. Эти dll - неуправляемый код, который вручную загружается через вызовы LoadLibray. Поэтому dll живут вне сферы действия домена приложения.

Чтобы освободить блокировки файлов, на которые запущен процесс пула приложений, вам необходимо либо переработать пул приложений, либо выгрузить DLL из памяти.

В пакете nuget Microsoft.SqlServer.Types отправлен класс, который используется для загрузки пространственных DLL, называемых SqlServerTypes.Utilities. Вы можете изменить метод LoadNativeAssemblies, чтобы выгрузить неуправляемые DLL, когда домен приложения выгружен. С этой модификацией, когда msdeploy копирует app_offline.htm, домен приложения выгружается, а затем выгружает управляемые DLL.

private static IntPtr _msvcrPtr = IntPtr.Zero;
private static IntPtr _spatialPtr = IntPtr.Zero;

public static void LoadNativeAssemblies(string rootApplicationPath)
{
    if (_msvcrPtr != IntPtr.Zero || _spatialPtr != IntPtr.Zero)
        throw new Exception("LoadNativeAssemblies already called.");

    var nativeBinaryPath = IntPtr.Size > 4
        ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
        : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");

    _msvcrPtr = LoadNativeAssembly(nativeBinaryPath, "msvcr100.dll");
    _spatialPtr = LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial110.dll");

    AppDomain.CurrentDomain.DomainUnload += (sender, e) =>
    {
        if (_msvcrPtr != IntPtr.Zero)
        {
            FreeLibrary(_msvcrPtr);
            _msvcrPtr = IntPtr.Zero;
        }

        if (_spatialPtr != IntPtr.Zero)
        {
            FreeLibrary(_spatialPtr);
            _spatialPtr = IntPtr.Zero;
         }
    };
}

Существует один предостережение при таком подходе. Предполагается, что ваше приложение работает только в рабочем процессе, использующем Spatial dll. Поскольку в пулах приложений могут размещаться несколько приложений, блокировки файлов не будут выпущены, если другое приложение также загрузило их. Это предотвратит работу вашего развертывания с той же ошибкой блокировки файла.

0
задан mobileink 13 July 2018 в 15:34
поделиться