Неуправляемая DLL C ++ - проблема создания и утилизации - C # - PullRequest
1 голос
/ 02 марта 2012

У меня есть неуправляемая DLL C ++, которую я использую на C # 2.0 через веб-приложение (IIS6). Чтобы использовать эту DLL, я создал оболочку с помощью утилиты tlbimp из .Net. Я хочу, чтобы эта DLL создавалась (создавалась) КАЖДЫЙ раз, когда происходит новый сеанс пользователя. И будет освобожден (утилизирован), когда пользователь выйдет из приложения и закроет браузер.

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

Я знаю об этом поведении, потому что этот компонент (DLL) вставляет новый реестр в EventLog каждый раз, когда он создается, и каждый раз, когда он удаляется. И в случае, о котором я упоминал, есть только один реестр создания и реестр без удаления, пока я не перезапущу IIS, тогда есть реестр удаления.

Вот код, который я реализовал, чтобы попытаться избавиться от объекта, но, похоже, он не имеет никакого эффекта.

public class ComObject: IDisposable
    {
        private ComClientClass_objCom;
        private bool _isDisposed = false;

        public ComObject()
        {
            _objCom = new ComClientClass();
        }

        ~ComObject()
        {
            Dispose(false);
        }

        protected void Dispose(bool disposing)
        {
            if (disposing)
            {
                //finalize unmanaged resources
                _objCom = null;
            }
            _isDisposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
            GC.Collect();
        }

    }

Я не знаю, связано ли это поведение с конфигурацией IIS или чем-то другим.

Кто-нибудь может мне объяснить, пожалуйста, почему это происходит? Потому что, насколько я знаю, эта же DLL использовалась со старым ASP, и тогда она работала нормально, поэтому я предполагаю, что это какая-то проблема с GC в .Net.

...