Exporting .NET DLLs with Visual Studio 2005 to be Consumed by Native Applications

Abstract

This article will explain how to create a wrapper for a .NET DLL and import it in MetaTrader 4. I used Visual Studio 2005 and wrote the example .NET DLL in C# and the wrapper in C++. The wrapper is again a DLL, which implements the Stdcall calling convention (MetaTrader 4 supports only this convention but you can produce a DLL with any calling convention as long as .NET supports it). The .NET DLL can be easily written in any other .NET language. The technique described below can be used to export .NET DLLs to be used by any unmanaged applications.

Motivation

When I decided to create an expert advisor for MetaTrader to test a trading strategy, I was frustrated because of many unsuccessful attempts to find out how to create DLLs and import them in the expert advisor. I am coming from a Java background and a year and a half of programming in C#. I have a slight knowledge of C++ and feel like I am crippled when I have to write something in it. Because of that, my first decision was to implement the trading strategy in C#. I spent days trying to figure out how, but my nerves couldn't stand it, so I gave it all up and switched to Visual C++ 6.0. When I realized how quickly I am in writing C++ code, I began having second thoughts and started trying in .NET again. After days of trial and error, I came up with the following step-by-step guide.

Step-by-Step Guide for Creating a Sample DLL

I. Creating the C# DLL

  1. Create a new C# class library project called CSharpAssembly in a new solution named DotNetDllForMetaTrader4.
  2. Add the following C# class file to the project:
  3. CSharpClass.cs:
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace CSharpAssembly
    {
       public class CSharpClass
       {
          public static byte[] Hello(byte[] name)
          {
             string s = ", hello from .NET!";
             byte[] helloPart = Encoding.ASCII.GetBytes(s);
             byte[] whole =
                new byte[name.Length + helloPart.Length];
             int i = 0;
             foreach (byte b in name)
             {
                whole[i++] = b;
             }
             foreach (byte b in helloPart)
             {
                whole[i++] = b;
             }
          return whole;
          }
       }
    }
    
  4. Change the CSharpAssembly project -> Properties -> Build -> Output path field to "..\debug". You do this to dump all the output to one folder.
    This step should be completed after adding CppStdcallInerfaceWrapper project to the solution because this will automatically change the solution platform from Any CPU to Mixed Platforms.

II. Creating the C++ Wrapper, Implementing the Stdcall Calling Convention

  1. Add to the solution a new C++ Win32 project called CppStdcallInerfaceWrapper with application type DLL.
  2. Change the CppStdcallInerfaceWrapper.cpp file content to:
  3. #include "stdafx.h"
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
    
    #using "CSharpAssembly.dll"
    using namespace CSharpAssembly;
    
    __declspec(dllexport) char* __stdcall Hello(char* name)
    {
       int i = 0;
       while (*name != '\0')
       {
          i++;
          name++;
       }
       array<unsigned char>^ nameManArr =
          gcnew array<unsigned char>(i);
       name -= i;
       i = 0;
       while (*name != '\0')
       {
          nameManArr[i] = *name;
          name++;
          i++;
       }
       array<unsigned char>^ char8ManArr =
          CSharpClass::Hello(nameManArr);
       char*  char8UnmanArr = new char[char8ManArr->Length + 1];
       for (int i = 0; i < char8ManArr->Length; i++)
       {
          char8UnmanArr[i] = char8ManArr[i];
       }
       char8UnmanArr[char8ManArr->Length] = '\0';
       return char8UnmanArr;
    }
    
  4. To make the Hello function visible in the CppStdcallInerfaceWrapper.dll through the Stdcall calling convention, add a new Module Definition file called CppStdcallInerfaceWrapper.def in the project source files. This will automatically set the project properties -> Linker -> Input -> Module Definition file.
  5. To add Hello to the list of exported functions, change the CppStdcallInerfaceWrapper.def content to the following:
  6. LIBRARY "CppStdcallInerfaceWrapper"
    EXPORTS
       Hello
    
  7. To call the CSharpAssembly.dll, go to project properties -> Configuration Properties -> General and add Common Language Runtime Support.
  8. To enable the compiler to locate the CSharpAssembly.dll, go to project properties -> C/C++ -> General -> Resolve #using References and add "$(SolutionDir)\debug".

III. Creating a Debug Entry Point Project

  1. Add to the solution a new C# console application project called DebugEntry.
  2. Add the following C# class file to the project:
  3. DebugEntry.cs:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace DebugEntry
    {
       class DebugEntry
       {
          [DllImport("CppStdcallInerfaceWrapper.dll",
                CharSet = CharSet.Ansi, CallingConvention =
                   CallingConvention.StdCall)]
            public static extern string Hello(string name);
    
            static void Main(string[] args)
            {
                System.Console.WriteLine(Hello("MyName"));
                System.Console.ReadLine();
            }
       }
    }
    
  4. Change the DebugEntry project -> Properties -> Build -> Output path field to "..\debug". You do this to dump all the output to one folder.
  5. In solution properties -> Common Properties -> Startup Project, change the single startup project to DebugEntry.

IV. Setting Project Dependencies and Building the Solution

  1. Go to solution properties -> Common Properties -> Project Dependencies and set the dependencies as follows:
    DebugEntry depends on CppStdcallInterfaceWrapper and CSharpAssembly,
    CppStdcallInterfaceWrapper depends on CSharpAssembly.
  2. Build the solution.

V. Testing the DLLs in MetaTrader 4

  1. Add to the Path environment variable the MetaTrader 4 main directory. Example: "C:\Program Files\MetaTrader 4". You can do it through My Computer -> Properties -> Advanced -> Environment Variables. You do this so MetaTrader 4 can locate your DLLs.
  2. Copy CSharpAssembly.dll and CppStdcallInerfaceWrapper.dll from "$(SolutionDir)\debug" to MetaTrader's main directory.
    The reason you don't put the DLLs in "C:\Program Files\MetaTrader 4\experts\libraries", where external DLLs for MetaTrader usually reside is that when the calling order is MetaTrader 4 Terminal -> CppStdcallInerfaceWrapper.dll -> CSharpAssembly.dll, it will not locate the CSharpAssembly.dll. The Path environment variable can't solve this because the CLR doesn't use it to locate assemblies. That's why I put the DLLs where the MetaTrader terminal executable is. In the Reference section below, there is a link covering the matter on runtime assembly location.
  3. In the MetaTrader platform, create a new expert advisor called DotNetDllTest.
  4. Before the init() function in DotNetDllTest.mq4, insert the following:
  5. #import "user32.dll"
    int MessageBoxA(int hWnd ,string szText,
                    string szCaption, int nType);
    
    #import "CppStdcallInerfaceWrapper.dll"
    string Hello(string name);
    
  6. At the beginning of the init() function, insert:
  7. MessageBoxA(100, Hello("MyName"), "", 0);
    The user32.dll is a DLL that comes with the Windows operating system; you use it just to show a box with the hello message.
  8. Run the DotNetDllTest expert advisor with Allow DLL imports option on.

Explanations about the Step-by-Step Guide

The DebugEntry project is not necessary, but with it you can debug other projects. To create a release version, all the properties setting steps must be replicated. In the Hello function, project CppStdcallInterfaceWrapper, the char8UnmanArr array is unmanaged and you have to deallocate it, using the delete operator, after you are finished using it in MetaTrader. To keep things simple, this is not done in the example above. You can do it by writing another function in the CppStdcallInterfaceWrapper and calling it from MetaTrader.

Another way of passing data to the unmanaged MetaTrader is not by creating an unmanaged copy, but by using the System.InteropeServices.GCHandle to pin the needed managed object while using it in the unmanaged MetaTrader, so the Garbage Collector doesn't move or delete it.

Other thing you sould take care of is the ecoding convention. .NET strings are in Unicode, whereas the calling application can support only ASCII, like with MetaTrader.

Security Issues

Although there are several available ways to protect your .NET DLLs from back engineering, this is not as secure as native byte code. References to other materials about this matter are provided in the next section.

References



About the Author

Boian Petkantchin

I am living in Bulgaria and studding mathematics at the Sofia University. I have been programming in Java for two years and now continuing in C# for the past year and a half. Mostly coding my own project and having participated in the development of event photography management application.

Downloads

Comments

  • Very Informative & Helpful

    Posted by overng on 10/23/2014 02:46am

    Hi Boian, Thank you for a very informative and well presented tutorial, which works 'out of the box'. I normally work with Unix, so don't have much experience with Windows code ... this has saved me many hours ;) I wish you well. overng.

    Reply
  • System.AccessViolationException when returning to debug entry

    Posted by Ernie on 08/19/2014 12:36pm

    Hi Boian, I get a System.AccessViolationException in my debug entry. I use VS2013 x86 on 64bit Win7. I have logged my query on code project please can you try to help. code project : http://www.codeproject.com/Messages/4883815/System-AccessViolationException-Returning-from-cpp.aspx#xx1329679xx

    Reply
  • købe billige ghd glattejern online i danmark

    Posted by carpinteyroowm on 06/15/2013 10:19am

    [url=http://ghdfladjerntilbud.webs.com/]Ghd fladjern tilbud[/url] Jeg selv har en BABYLISS faktum, jeg arbejder en god strygning det med en roterende linie, svarende til temperaturkontrol og ydeevne væksthormonmangel, peeeero sin afrundede tromle er ikke en reel smerte og omkostninger, så bølgerne eller krøllet hår …Forskellen er at kontrollere på den sidste dag, jeg gik til min sædvanlige hår stylist og spurgte deres ondularan hår, samt fjerne en væksthormonmangel (GOLD Classic model), det var en reel overraskelse at se, hvordan komfortable Han synes at bruge den hastighed, hvor hurtigt ende, en meget professionelle resultater. [url=http://glattejern-ghd.weebly.com/]Glattejern ghd[/url] Du kan manuelt styre temperaturen i ghd glattejern. Hvis du ønsker en høj temperatur kontakt dit hår, så du kan varme lang tid at nå dine ønskede temperatur. Du kan bruge. Bemærk: når du bruger ghd glattejern, skal du være opmærksom på deres egen sikkerhed, for at undgå at blive brændt. Let at bruge ghd glattejern, godt modelleringsværktøjer.Perfekt hår tænketank til at hjælpe dig med at ændre dit udseende, kan du finde online DVD præsentation af måder at opnå varme ghd glat hår stilarter trin for trin instruktioner. Såsom hands-on lære dig, så snart som muligt fortrolig med brugen af billige ghd glattejern. [url=http://glattejern-ghd.weebly.com/]Glattejern ghd[/url] Ligesom enhver anden hårudglatningsmiddel i ghd hår stabil, den metalliske Collection glattejern garanteret sikker at bruge. De er drevet ved hjælp universel spænding, hvilket gør dem praktisk for styling farten. De metalliske serien stylers også komme med en varme-bevis sag og en to-årig garantiperiode.Den Metallic Collection indeholder tre ghd glattejern med et slankt og skinnende finish. De er nemlig: ghd skinnende Silver Metallic Series Styler, ghd Rich Ruby Red Metallic Series Styler, og ghd Sahara Gold Metallic Series Styler.Hver ghd glattejern i Metallic Collection har de samme innovative funktioner som den klassiske ghd guld V glattejern, en af de bedst sælgende stylers i ghd produktlinje. Disse stylers er velegnede til alle hårtyper. Også med deres keramisk varmelegeme teknologi designet til at forsegle fugt i individuelle hår tråde, er disse stylers alle garanteret til at give ekstra glans og glans til håret, hvad enten det er krøllet, vinkede eller stryges lige.

    Reply
  • dringennadringenna

    Posted by dringenna on 06/09/2013 07:57pm

    vibramfivefingerscheaper.com http://www.vibramfivefingerscheaper.com/ buyredbottoms.net www.vipchristianlouboutinsaleusa.com http://www.buyredbottoms.net www.vipchristianlouboutinsaleusa.com http://www.vibramfivefingerscheaper.com buyredbottoms.net

    Reply
  • Het kiezen van oordopjes voor werkende is geen snel proces, omdat het is het element van ons leven

    Posted by mrswanzi on 06/06/2013 09:53pm

    [url=http://koptelefoon-monsterbeats.webs.com/]beats by dre[/url] Zo is Lady GaGa in de clip van Pokerface uit 2008 te zien met een Beats by Dr. Dre. Het is slechts een paar tellen, maar na de introductie van de muziekvideo stellen vele fans diezelfde twee vragen: van welk merk is toch die hoofdtelefoon met die rode B en hoe kom ik daaraan Steeds meer artiesten volgden het voorbeeld van LeBron James en Lady GaGa. Niet omdat de hoofdtelefoons significant beter waren dan andere merken, maar puur vanwege de uitstraling: mode. [url=http://koptelefoon-monsterbeats.webspawner.com/]beats by dre kopen[/url] De urBeats zijn wederom ontstaan uit een perfecte samenwerking tussen Monster en Dr. Dre. Zodoende zijn ook deze in-ears verschenen onder het Beats By Dr. Dre label, waar al meer succesnummers onder zijn uitgebracht. Deze voorzien allen in unieke audioprestaties en een stijlvol design. Het is ook daarom dat deze urBeats de titel met trots mogen dragen! [url=http://koptelefoon-monsterbeats.tumblr.com/]Goedkope Dr Dre Beats [/url] De hoofdtelefoons en oordopjes zijn allemaal ontzettend stevig! Omdat de meeste modellen van verhard plastic zijn gemaakt of zelf van aluminium zijn ze moeilijk kapot te krijgen. Veel hoofdtelefoons van andere merken gaan veel sneller kapot. Een setje Beats gaat dus veel langer mee wat uiteindelijk scheelt in de kosten.

    Reply
  • http://www.nikeairmaxwr.com/ jmmiln

    Posted by http://www.nikeairmaxwr.com/ Mandypdc on 03/30/2013 06:14am

    Not through the clouds shuttle's ability to grow a variety of ways, but this strange man to the inside through the clouds shuttle injected Reiki, With the injection Reiki increase, the clouds shuttle constantly from a magic weapon to Lingbao later with this strange man becomes a Tempo, and later said that this strange man after missing a forged Yuan Ying. Some people say that oakley sunglasses sale already soaring Once upon a time. Zhuo who repair, I'm afraid next life use the Tempo is wishful thinking. But Zhuo who does not need to use the Tempo Zhuo who only need ray ban inside the aura.cheap ray ban sunglasses, And this aura after the injection of legend who did not know that there is much.ray ban wayfarer, Through the clouds to shuttle the material is extremely strange, actually be able to withstand such a big the Aura pressure without crash, do not know who Warren is how to find such material.ray ban wayfarer sizes, But even the best materials, can not be inside the injection so many Reiki without leaking.

    Reply
  • http://www.oakleysunglassesoutc.com/ pvriry

    Posted by http://www.oakleysunglassesoutc.com/ Mandyvys on 03/29/2013 05:46am

    ghd australia,Huge economic benefits, but also much smaller than abuse coppers as the risk of exposure to big money. The court can receive silver and copper coin casting tax Zhili can the currency row entrusted to the bank, its credit and administrative means to support the currency row, get huge profits from The Industrial and Commercial Bank undertake currency row. And powerful opportunity Zhili Governor House to open up the market, the share of the banking and financial sector dominated by foreign banks to recapture. ICBC and not like its ghd straightener banks, as has just opened is necessary to the busy open up the market pull deposits they have already mastered, but just opened a huge wealth by contractors currency line and began to count the money a few hand cramps to the point where .ghd sale, Plus Tan Yankai Guangdong businessmen to repay borrowings through the use of the U.ghd hair straightener,S.cheap ghd, dollar, making ICBC have mastered the huge amount of dollar deposits in the short term, the joint three shipbuilding docks out payments through the operation of the Industrial and Commercial Bank, said in the business the ICBC the money liquidity is very large.

    Reply
  • wholesale sunglasses

    Posted by qgliliImpumpcuo on 03/28/2013 10:56pm

    http://onlineguciisunglass.webs.com - cheap ray ban wayfarer cheap ray ban,,,, http://replicaguccisunglasses.webs.com - replica oakleys cheap ray ban wayfarer http://discountsunglassessale.webs.com - akley discount replica ray ban http://sunglasssaleulow.webs.com - cheap sunglasses wholesale oakley sunglasses http://discountsunglassessale.webs.com - discount ray ban ray ban cheap

    Reply
  • fake ray ban sunglasses

    Posted by jgliliImpumpzgu on 03/28/2013 08:23pm

    http://cheapsunglassesshop.webs.com - cheap oakley replica oakleys http://sunglasspomoteauthentic.webs.com - ray ban sunglasses cheap cheap ray ban http://discountsunglassesfinewebs.com - discount sunglasses cheap oakleys http://bestsunglassesshop.webs.com - fake oakley sunglasses cheap ray ban wayfarer http://sunglasspomoteauthentic.webs.com - cheap ray ban sunglasses fake oakley sunglasses

    Reply
  • Isabel Marant Sneakers

    Posted by Hauddessy on 03/28/2013 10:07am

    [url=http://future-select.co.uk/fckeditor/isabelmarantsneakers.aspx]isabel marant boot sale[/url] 07 qiu dong make an appearance,,, like mashups, low-key, can reference! Isabel Marant is recent period designers in France, a only one won a colleague of the international manufacture have attention. After graduating from design style in Paris Studio Bercot, Isabel Marant Yorke and Cole in his figure as a colleague to follow. Spring/summer 2008 the latest thing prove in Paris - the Isabel Marant [Isabel Marant is enthusiasm! Morning star facsimile wear increased in sneakers tide zealot to concourse "mixing in the" needful Neutral look at name avenue part, nothing but recollect, Isabel Marant sneakers increased progress in Europe and the Mutual States is a intrinsic verve! Top banana, acclaimed copy wearing! At hand trend label Isabel ma LAN (Isabel Marant) to motivate the stir of the contemporary cyclone, with long skirts, pants, leather pants, etc. Contrary mention with Isabel ma LAN (Isabel Marant), the craze sneaker avenue snap demonstrations, upon sports sandals teeming rocks in inspiration. Isabel ma LAN (Isabel Marant) shoot for good occasionally pushed on this kind of shoes is in shape far, snapping up, at present in many peculiar shopping website have been sold out. Miranda Kerr, louring leather pants with red [url=http://gateway.recruitment-websites.co.uk/fckeditor/isabelmarant.aspx]isabel marant heels[/url], sufficiency of the color and style. Black and silver match colors, Isabel Marant tie-up and stringent jeans, locomotive leather, handsome Outrageous and white match colors Isabel Marant jeans match and the entirety heart Isabel Marant Ebony even with put on clothing + frog represent, is not a unseemly chart Kate potts voss, Isabel Marant sneaker together with the coin country-like chiffon dresses to rub off last, play is a mashup Solid cream + hand-knitted sweater fastens with color Isabel Marant Isabel Marant sneaker,Cambridge package fluorescent color highlight is the aggregate body Lovers out of the street, Isabel Marant makes mother wit at wish Isabel Marant Website is efforts to donation a pass now. Isabel Marant shoes Comely grey color Isabel Marant sneaker Lightning down and pink are quite let a person enchanted. The multicolor distribution model

    Reply
  • Loading, Please Wait ...

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

  • Companies must routinely transfer files and share data to run their business, work with partners, and speed operations. However, many find the traditional approach to file transfer lacks necessary security, is too complex and difficult to manage, does not support the levels of automation needed, and breaks down when addressing the file transfer requirements of new areas like Big Data analytics and mobile applications. This QuinStreet SmartSelect discusses how the changing business environment is making the use …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds