Problem of Unloading Managed C++ DLL...

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • chandramohanp
    New Member
    • Oct 2008
    • 10

    #1

    Problem of Unloading Managed C++ DLL...

    I am having problem to delete a Managed C++ DLL that was used in a
    pure C# DLL even in the following scenario.


    1. Launch the application. This applicatio has its own default
    applicaiton domain.
    2. Create a new Application Domain.
    3. Load the Pure C# DLL in the new applicaiton domain. This C# DLL uses
    managed C++ DLL.
    4. Create a Proxy object using CreateInstanceA ndUnwrap for the wrapper
    object which is a wrapper for the class used from the pure C# DLL.
    This wrapper object is exported from a seperate DLL.

    DLL Configuration:- Wrapper for C# DLL, C# DLL, Managed C++ DLL.
    The wrapper C# is used so that the main C# will not be loaded into
    the default application domain when creating a Proxy object using the
    menthod CreateInstanceA ndUnwrap. The application domain talks with
    only the wrapper DLL. If we do not have wrapper class, then the main
    C# DLL will also be loaded into the default application. The sideeffect
    of this is that, even when the new application is unloaded, we will not
    be able to delete the main C# DLL. Wrapper is just a call frowader to
    the C# DLL class.

    5. Give the class name exported from C# DLL to the wrapper object and ask
    it to create an instance of the class. The wrapper class creates the
    the class and initializes its membet to it, so that it can forward
    call requests.
    6. From the default application domain, call a method on the wrapper object.
    This call on the wrapper object calls the method on the C# class. This
    C# class uses a function exported from a managed C++ DLL.
    7. After executing the methods, unload the new application domain.
    8. Now try to delete C# DLL, Mananged C++ DLL.


    I was able to delete C# DLL, but not MC++ DLL. After further investigation
    I found that the Visual Studio "Output" window has the following two lines:-

    'Application.ex e': Loaded 'C:\DLL1\Debug\ MCPP.dll', Symbols loaded.----> LOADING FIRST TIME
    'Application.ex e' (Managed): Loaded 'C:\DLL1\Debug\ MCPP.dll', Symbols loaded. ----> LOADING SECOND TIME

    When the method on C# class is getting executed, the output log file
    contains the above two lines. The .NET framework is loading it twice.
    Once as Native C++ DLL, second time as Managed DLL.

    Does any one know how to delete the MC++ DLL.
  • chandramohanp
    New Member
    • Oct 2008
    • 10

    #2
    Hi

    After further investigation I found out that the default application domain is also loading the MC++ DLL even though I do not use it anywhere in the default application domain. The only place I use MC++ DLL is in the C#. The C# DLL gets unloaded when I unload the new application domain since it was loaded only in the new application domain. Why is the MC++ DLL getting loaded both in default and new application domain.

    Thanks
    Chandra

    Comment

    • chandramohanp
      New Member
      • Oct 2008
      • 10

      #3
      I found the solution to my problem. The problem is because the Managed C++ DLL that has been used in C# DLL refers to native C++ DLLs that have already been loaded in the main application i.e. default application domain.

      So when the managed C++ DLL is getting loaded via C# DLL, the framework instead of loading the native C++ DLL in the new applicaiton domain, uses the DLLs from the default application domain. This is causing the managed C++ DLL also to be loaded into the default application domain. Because of this reason I was not able to delete the managed C++ DLL.

      Comment

      Working...