Click here to Skip to main content
Click here to Skip to main content

Dynamically loading a DLL - MC++

, 27 May 2002
Rate this:
Please Sign up or sign in to vote.
Shows how you can load an assembly at run time, instantiate a class in that assembly and call methods on the class

Introduction

Today someone was asking how he can load a DLL dynamically with .NET. For some design related reasons he didn't want to add a reference to the DLL at compile time. For all I know this might be something everyone knew about except this particular individual and me. But I didn't know anything about this and I had never thought that anyone would want to do anything like that. Anyway as I found out it was really easy. This example is completely in MC++. Just in case someone starts flaming me saying this is an oft-discussed topic, I can always claim this is the first MC++ example. And my google searches kept directing me to pages that talked about normal dynamic loading of DLLs [means the non-.NET stuff]

The DLL

Create a simple class library called Abc.dll. This will be the DLL which we will load dynamically.

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;

namespace Abc
{
    public __gc class Class1
    {
    public:
        //This simply prefixes a Hello
        //to whatever string is passed
        String* Hello(String* str)
        {
            return String::Concat(S"Hello ",str);
        }
    };
}

The Program

Okay, this is the little program that will load the above DLL, and call the Hello function, passing a string to it and also getting back the string that the function returns. Remember that Abc.dll must be in the same directory as our program's executable. I believe there are ways to put the DLL in some special directories that all .NET programs look into, but I am totally ignorant of such things.

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;
using namespace System::Reflection;

int wmain(void)
{
    //First we load our assembly
    //using the display name
    Assembly *a = Assembly::Load("Abc");

    //Now we get the type of the object
    //we want to instantiate. Since our class is
    //part of the assembly we have to use the full
    //name of the class with assembly name
    Type *t = a->GetType("Abc.Class1");

    //The MethodInfo class is used to
    //describe a method. It holds metadata about
    //a particular method. We get the MethodInfo for
    //our Hello method    
    MethodInfo *mi = t->GetMethod("Hello");    
    //Just showing off some public properties
    Console::WriteLine("Return type of *{0}* method is *{1}*",
        mi->Name,mi->ReturnType);

    //We create an instance of our object.
    //Here the default constructor is called.
    Object *o = Activator::CreateInstance(t);

    //Prepare our argument list
    String *args[] = new String*[1]; 
    args[0]= S"Nish";  
  
    //We use Invoke to call the Hello method
    //on the object we got from CreateInstance above
    //We pass to it our arguments as an Object array
    String *s1=static_cast<String*>(mi->Invoke(o,args));
    Console::WriteLine(s1);
    return 0;
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Nish Sivakumar

United States United States
Nish is a real nice guy who has been writing code since 1990 when he first got his hands on an 8088 with 640 KB RAM. Originally from sunny Trivandrum in India, he has been living in various places over the past few years and often thinks it’s time he settled down somewhere.
 
Nish has been a Microsoft Visual C++ MVP since October, 2002 - awfully nice of Microsoft, he thinks. He maintains an MVP tips and tricks web site - www.voidnish.com where you can find a consolidated list of his articles, writings and ideas on VC++, MFC, .NET and C++/CLI. Oh, and you might want to check out his blog on C++/CLI, MFC, .NET and a lot of other stuff - blog.voidnish.com.
 
Nish loves reading Science Fiction, P G Wodehouse and Agatha Christie, and also fancies himself to be a decent writer of sorts. He has authored a romantic comedy Summer Love and Some more Cricket as well as a programming book – Extending MFC applications with the .NET Framework.
 
Nish's latest book C++/CLI in Action published by Manning Publications is now available for purchase. You can read more about the book on his blog.
 
Despite his wife's attempts to get him into cooking, his best effort so far has been a badly done omelette. Some day, he hopes to be a good cook, and to cook a tasty dinner for his wife.

Comments and Discussions

 
QuestionHow to load mixed managed dll Pinmembersandi_ro3-Oct-07 5:42 
GeneralInterface and casting issue PinmemberY_R4-Aug-07 4:30 
GeneralUsing OpenGL and GNU in Visual C++.NET (2002) PinmemberSctt H. Chang21-Aug-03 5:21 
GeneralRe: Using OpenGL and GNU in Visual C++.NET (2002) PinmemberFfelagund1-Mar-04 10:30 
QuestionHow to Pinmembervinodgs5-Aug-03 10:31 
AnswerRe: How to PineditorNishant S5-Aug-03 14:45 
GeneralRe: How to Pinmembervinodgs5-Aug-03 16:35 
GeneralMethodInfo null pointer (help please) Pinmemberbrow083327-Jun-03 6:30 
GeneralFound it! Pinmemberbrow083327-Jun-03 11:31 
QuestionRe: Found it! PinsussAnonymous14-Oct-05 3:19 
Questionand you cann't unload the dll??? Pinmemberfftongzhi10-Sep-02 23:37 
AnswerRe: and you cann't unload the dll??? Pinmemberfftongzhi15-Sep-02 18:40 
GeneralGood Article Pinmemberjakesher29-May-02 13:00 
GeneralRe: Good Article PinmemberNish - Native CPian29-May-02 15:18 
GeneralRe: Good Article PinmemberMadhu C9-Jun-02 16:28 
GeneralRe: Good Article PinmemberNish - Native CPian9-Jun-02 17:24 
Generalregular dll PinmemberKannan Kalyanaraman28-May-02 20:47 
GeneralRe: regular dll PinmemberNish - Native CPian29-May-02 15:19 
GeneralRe: regular dll PinmemberTaranis3-Jun-02 9:37 
GeneralRe: regular dll Pinmember.dan.g.16-May-05 17:19 
GeneralNext Target -100 Articles PinmemberAmita Butch28-May-02 3:38 
GeneralRe: Next Target -100 Articles PinmemberNish - Native CPian28-May-02 3:44 
GeneralThis completed your half century PinmemberRama Krishna28-May-02 2:06 
GeneralRe: This completed your half century PinmemberNish - Native CPian28-May-02 3:41 
GeneralRe: This completed your half century PinmemberShog928-May-02 11:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web02 | 2.8.141022.1 | Last Updated 28 May 2002
Article Copyright 2002 by Nish Sivakumar
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid