Sample: Mixing Unmanaged C++, C++/CLI, and C# code


Back in May 2005 I posted an article on how to mix C# and C++ code in single assembly.


I still get emails asking for samples.  So I created this simple sample. Enjoy.


We have this simple unmanaged C++ class UnmanagedFoo:


E:\sample\vc\mixed>more ufoo.h
#include <stdio.h>
class UnmanagedFoo
{
public:
    UnmanagedFoo() {printf(“Constructing UnmanagedFoo\n”);}
    ~UnmanagedFoo() {printf(“Destructing UnmanagedFoo\n”);}
   void ShowYourself();
};


And implementation:


E:\sample\vc\mixed>more ufoo.cpp
#include “ufoo.h”
void UnmanagedFoo::ShowYourself()
{
    printf(“UnmanagedFoo\n”);
}


Another simple C++/CLI class ManagedFoo, with a member of UnmanagedFoo.


E:\sample\vc\mixed>more mfoo.cpp
#include “ufoo.h”
#using <mscorlib.dll>
using namespace System;


ref class ManagedFoo
{
public:
    ManagedFoo()
    {
        Console::WriteLine(“Constructing ManagedFoo”);
        m_foo = new UnmanagedFoo();
        if (!m_foo) {
            throw gcnew OutOfMemoryException();
        }
    }
    ~ManagedFoo() {ShowDestruction();}
    !ManagedFoo() {ShowDestruction();}
    void ShowYourself()
    {
        Console::WriteLine(“ManagedFoo”);
        m_foo->ShowYourself();
    }
private:
    void ShowDestruction()
    {
        if (m_foo) {
            delete m_foo;
        }


        Console::WriteLine(“Destructing ManagedFoo”);
    }
    UnmanagedFoo *m_foo;
};


C# class Bar uses ManagedFoo:


E:\sample\vc\mixed>more bar.cs
using System;
class Bar
{
    public static void Main()
    {
        ManagedFoo foo = new ManagedFoo();
        foo.ShowYourself();
    }
}


Let us build the project.


First, compile ufoo.cpp into (unmanaged) obj file.


E:\sample\vc\mixed>cl.exe /Zi /MD /c ufoo.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80×86
Copyright (C) Microsoft Corporation.  All rights reserved.


ufoo.cpp


And mfoo.cpp


E:\sample\vc\mixed>cl.exe /Zi /clr /c mfoo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.42
for Microsoft (R) .NET Framework version 2.00.50727.88
Copyright (C) Microsoft Corporation.  All rights reserved.


mfoo.cpp


And bar.cs, referencing mfoo.obj


E:\sample\vc\mixed>csc /target:module /addmodule:mfoo.obj bar.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.88
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.


Finally, let’s link everything together.


E:\sample\vc\mixed>link mfoo.obj ufoo.obj bar.netmodule /entry:Bar.Main /out:test.exe /subsystem:console /ltcg
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.


Generating code
Finished generating code


Now we have a single file assembly test.exe, mixed with unmanaged C++, C++/CLI, and C#.


E:\sample\vc\mixed>test
Constructing ManagedFoo
Constructing UnmanagedFoo
ManagedFoo
UnmanagedFoo
Destructing UnmanagedFoo
Destructing ManagedFoo


We can also put ufoo.obj into a lib and link the lib in the final step, instead of using ufoo.obj directly.


E:\sample\vc\mixed>lib ufoo.obj /out:ufoo.lib
Microsoft (R) Library Manager Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.


E:\sample\vc\mixed>link mfoo.obj ufoo.lib bar.netmodule /entry:Bar.Main /out:test2.exe /subsystem:console /ltcg
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.


Generating code
Finished generating code


E:\sample\vc\mixed>test2
Constructing ManagedFoo
Constructing UnmanagedFoo
ManagedFoo
UnmanagedFoo
Destructing UnmanagedFoo
Destructing ManagedFoo

Comments (11)

  1. Kris says:

    This is nice. Can you show a sample of how to use a COM Object (say which doesn’t support IDispatch) to be use with C++/CLI (which inturn could be used by C#).

  2. Harry Zhang says:

    in your blog, you showed mixing unmanaged c++, c++/CLI, c#.

    but how do I mix unmanaged c++ with c#? instead of using command line to compile and link, how to do this in visual studio 2005?

    You answer is greatly appreciated.

    Harry

    avstech@gmail.com

  3. keith1000 says:

    How to do all this in the context of Visual Studio 2005 ?. There does not seem to be a way to mix different manage languages in one assembly.

  4. Keith1000,

    I don’t think this is possible in Visual Studio 2005.

  5. Julien B. says:

    Thank’s for this nice tuto’ Junfeng.

    Does this procedure work to use unmanaged C++ with VB.Net? Or is that a specific case?

  6. I never used VB.Net, but I imagine it should work, as long as the compiler supports netmodule.

  7. carlisia says:

    Thanks for this sample. Is it possible to call a C# dll from a C application? All of the text I find is about C++ as unmanaged code interoping with managed code. How about C->C#? Please, can anyone point me to something useful?