C++;非托管dll-实例化和处置问题-C# 我有一个C++非托管DLL,我在C应用程序2上使用了一个Web应用程序(IIS6)。为了使用这个DLL,我使用.Net中的实用工具tlbimp创建了一个包装器。 我希望在每次新用户会话发生时创建(实例化)该DLL。并在用户注销应用程序并关闭浏览器时释放(释放)

C++;非托管dll-实例化和处置问题-C# 我有一个C++非托管DLL,我在C应用程序2上使用了一个Web应用程序(IIS6)。为了使用这个DLL,我使用.Net中的实用工具tlbimp创建了一个包装器。 我希望在每次新用户会话发生时创建(实例化)该DLL。并在用户注销应用程序并关闭浏览器时释放(释放),c#,c++,wrapper,C#,C++,Wrapper,我遇到的问题是,现在当第一个用户连接到应用程序时,对象正在被创建,但当其他用户登录时,相同的前一个对象正在被重用,并且当每个用户断开与系统的连接时,在我重新启动IIS之前,对象不会被释放 我知道这种行为,因为该组件(DLL)在每次实例化和处置时都会在事件日志中插入一个新的注册表。在我提到的例子中,只有一个创建注册表和非dispose注册表,直到我重新启动IIS,然后才有dispose注册表 下面是我为处理对象而实现的代码,但它似乎没有任何效果 public class ComObject: ID

我遇到的问题是,现在当第一个用户连接到应用程序时,对象正在被创建,但当其他用户登录时,相同的前一个对象正在被重用,并且当每个用户断开与系统的连接时,在我重新启动IIS之前,对象不会被释放

我知道这种行为,因为该组件(DLL)在每次实例化和处置时都会在事件日志中插入一个新的注册表。在我提到的例子中,只有一个创建注册表和非dispose注册表,直到我重新启动IIS,然后才有dispose注册表

下面是我为处理对象而实现的代码,但它似乎没有任何效果

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中使用,当时它工作正常,所以我认为这是.Net中GC的某种问题

_objCom=null在释放非托管资源方面没有任何作用;您需要释放的非托管资源是什么?如果您有权访问原始asp代码,则需要查看它-上述内容存在许多问题,包括您没有释放com对象,即使您确实按照您指定的行为释放了com对象,simoultaneous请求也将使用相同的对象,即使您确实释放了com对象,更糟糕的是,当一个请求释放时,另一个请求会尝试使用释放的对象。据我所知,如果不重新启动DLL,就无法从IIS卸载DLL,因为IIS会缓存和重用DLL。我认为您只能通过使用命令“net stop iisadmin/y”、“mtxstop”和“net start w3svc”重新启动MTS来处理它。不过,这很可能对你没有什么帮助/这样做怎么样:Marshal.ReleaseComObject(_objCom)?它对释放对象有什么影响吗?@lidermin-这本身就值得提出一个全新的问题,但足以说明任何本机dll只会被IIS加载一次,因此行为取决于dll的实现。我希望调用某种工厂来获得实际的对象,但这取决于实现。