C# DLL을 포함하여셔 .Net에서 만들어진 DLL은 기본적으로 meta4 뿐만 아니라 다른 프로그램에서 직접 불러서 쓸 수가 없습니다.
이것을 이해하려면 C#의 Managed Code와 Unmanaged Code의 차이를 이해하여야 하는데요.
.Net에서는 기본적으로 CIL Code까지만 compile되고, 나머지는 각각 하드웨어에 맞게 Runtime에서 나머지가 컴파일된다. 여기서 Compile time까지의 Code를 managed code라고 하는데 즉 managed code는 반쯤 컴파일된 .Net 전용의 DLL이 된다. 그래서 다른 프로그램에서 당연히 불러서 쓸 수가 없다. 반면 unmanaged code는 전부 컴파일이 완료되어서 다른 프로그램에서 가져다가 쉽게 쓸 수 있도록 해주게 됩니다.
C# DLL과 다른 프로그램을 연동하기 위해서는 그래서 COM을 쓴다든지 다른 방법들을 써야 합니다.
저는 MFC로 dll 만들어서 연동을 시도하였었는데,
그것보다 더 좋은 방법이 나왔군요. Robert Giesecke라는 사람이 만든 unmanaged exports 를 사용하면 되는군요. 그에 대한 내용은 여기 참조 https://sites.google.com/site/robertgiesecke/
제일 처음에는 template 형태로해서 그걸 선택해서 쓰는 거였는데, 지금은 NuGet package안에 포함이 되어 있습니다.
NuGet package를 다운로드 받는 방법은 Visual Studio에서 Tools > Extension Manager안에 Online Gallery에 보면 NuGet Package Manager가 있습니다. 이걸 다룬로드 받아서 설치를 하시면 됩니다.
그 다음 MT4에서 사용하기 위해서 Visual Studio에서 classlibrary project를 만들거나 불러온 다음에 reference에서 오른쪽 클릭을 하면
NuGet Packages를 선택할 수 있도록 추가된 것을 볼 수 있습니다. unmanaged exports를 사용하려면 당연히 NuGet Packages를 선택합니다.
그럼 이런 화면이 나타나는데 여기서 검색 창에 unm 정도 입력해주면 바로 위에 나타납니다. 이거 그냥 클릭질해서 찾으려다가 토나오는 줄 알았음다. 제가 빨갛게 표시를 해놓은 곳 보이시죠?
그 다음 소스 코드는
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RGiesecke;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace MetaTest
{
public class Test
{
[DllExport("Add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
}
이렇게 해주시면 됩니다. 이렇게 해서 빌드해서 만들어진 DLL을
MT4 Experts 폴더 안에 libraries 폴더 안에 집어 넣으시고
요러코럼 하시면 됩니다.
그리고 mql 파일은
//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#include <stdlib.mqh>
#import "MetaTest.dll"
int Add(int left, int right);
#import
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Print(Add(1, 25));
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
SendNotification("ooooo");
//----
return(0);
}
//+------------------------------------------------------------------+
요러코럼 하시면 됩니다. 이렇게 해서 대망의 실행을 해보시면 127번 에러가 뜨게 됩니다. ㅠ.ㅜ
안뜨시고 제대로 실행되시면 다행, dll 권한 허용도 안하시고 안된다고 하시면 안되구요.
이것 해결하려고 정말 많은 자료 찾았습니다. c++ 에서 def파일을 안 써서 그렇다 뭐 어쩠다. 등등
그러나 그딴 파일 c#에서는 없습니다. 좌절을 하면서 여러 자료를 찾던 중
빌드할 때 any cpu쓰면 meta4에서 127번 오류 뜨게 된다는 문구를 간신히 찾았습니다.
바로 아래에 표시한 부분 되겠습니다. 이게 어딨는지는 한번 찾아보세요 ㅋㅋ 이걸 x86으로 해서 컴파일 했더니 바로 잘 실행이 되는군요. 확실히 이전에 MFC이용해서 DLL만들때 보다는 편한것 같습니다.
참조문헌
'backup' 카테고리의 다른 글
fx마진거래 2013.6.28 (0) | 2013.06.28 |
---|---|
병렬 컴퓨팅 Mutex와 Semaphore (0) | 2013.06.28 |
2013.6.27 거래2 (0) | 2013.06.27 |
심심풀이 FX 2013.6.27 (0) | 2013.06.27 |
심심풀이 실전 FX 2013.6.25(2) (0) | 2013.06.27 |