2014年03月01日

【MT4】C#でDLLを作成してみた

この記事を見つけまして・・・

Exposing C# code to MQL5 using unmanaged exports
http://www.mql5.com/en/articles/249

素人の私が見よう見まねでやってみました。MT5ではなく、MT4 Build610になります。

開発環境はWindows7 64bit/Visual Studio Express 2012です。


作り方
①Visual C#のクラスライブラリを選択して新しいプロジェクトを作成します。
classC.jpg


②[ツール]→[NuGet パッケージ マネージャー]→[ソリューションのNuGetパッケージの管理]を選択

③[オンライン]の[nuget.org]から「Unmanaged Exports」を選び、インストールします。検索したほうが早いです。
Unmanaged.jpg


④コードを書きます。


using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
public class Class1
{
[DllExport("Plus", CallingConvention = CallingConvention.StdCall)]
public static int Plus(int left, int right)
{
return left + right;
}
}
}



⑤[プロジェクト]→[プロパティ]→[アプリケーション]で、対象のフレームワークを「.NET Framework 4」にします。
framework.jpg

.NET Framework 4.5ではうまくいかなかったです。どうしてなんでしょう?


⑥同じく、[プロジェクト]→[プロパティ]→[ビルド]で、プラットフォームターゲットを「x86」にします。
release86.jpg

MT5の場合「x64」にします。


⑦ビルドします。(F7を押す)


以上です。あとは普通に使うだけです。


個人的にはC#でプログラムを作ってますし、比較的簡単に作れるなと思いました。自分で使うDLLならこれで問題なく感じます。どうでしょうか。
posted by ロンド at 15:24| Comment(17) | MT4 | 更新情報をチェックする
この記事へのコメント
初めまして、コムと言います。

DLLについて調べていてこちらのサイトを知り記事を読ませて頂きました。

C#で作ってみたいと思い、開発環境はVisual Studio Express 2013 Windows7 64bitで記事と同じように作ってみたのですが、
error : syntax error at token '{' in:
とエラーが出てコンパイルが出来ませんでした。

構成マネージャーの組み合わせもAnyCpu x86 x64と変えて見ましたがコンパイルできませんでした。
もし何か気づく事がありましたら、大変お手数ですがヒントだけでも頂けないでしょうか。

よろしくお願いします。
Posted by コム at 2014年09月29日 15:40
>コムさん

はじめまして。コメントありがとうございます。

syntax errorということは、{と}の数は同じになってますでしょうか。
構文エラーなので何かが足りないとか多いんだと思うのですが。。。
もう一度確認をお願いします。

こちらは同じ環境VS2013 win7 64bitでやってみましたが、うまくいきました。
うまくいくといいですね。
Posted by ロンド at 2014年09月29日 19:06
こんばんは、ロンドさん。

同じ環境で試してみて頂いてありがとうございます。

[DllExport~の行をコメントアウトするとコンパイルが出来ましたので、コード自体は大丈夫のように見えます。

AppData\Local\Temp\tmp35F1\Test.il(58) : error : syntax error at token '{' in: {
と表示されますのが、原因が掴めずにいます。

ロンドさんの環境では問題が無かったという事ですので、自分の環境のようです。
もう少し色々調べてみます。
お手数おかけして申し訳ありません。
ありがとうございます。
Posted by コム at 2014年09月29日 22:26
>コムさん

なるほど。ちょっと検索して調べてみたのですが、同じような症状の人がいるみたいです。

↓中国語でよく分からないですけど。しかもmqlフォーラムで。
http://www.mql5.com/zh/forum/17138

うーん、よく分からないです。
もう一度最初から新しくプロジェクトを作り直してやってみてもだめでしょうか。
もうちょっと調べてみます。
Posted by ロンド at 2014年09月30日 00:26
こんにちは。

検索までして頂いてありがとうございます。
自分では見つける事が出来ませんでした。
ページを自動翻訳してみたところ同じ症状のようです。

プロジェクトの作り直しをしても駄目でしたので、3回ほどインストールをし直し、
別のPCでも3回ほど入れ直して作ってみましたけど同じ症状が出ました。

環境の問題の可能性もありそうです。
もう少し調べてみたいと思います。

お手数おかけして申し訳ありません。
ありがとうございます。
Posted by コム at 2014年09月30日 17:23
>コムさん

こんにちは。

どうしてなのか非常に興味があります。
プロのプログラマーならすぐに解決となるのかもしれませんが、
私は独学でやっているぐらいなのでどうすればいいのかが分かりません。

もう一台PCがあるので明日そちらでも試してみようと思います。
ちょっとした設定とか何かなんだとは思うのですが、うーん何だろう。。。
自分の勉強も兼ねてお付き合いします。
Posted by ロンド at 2014年09月30日 19:26
こんにちは。

お手数おかけして申し訳ありません。
ビルドのプラットフォーム ターゲットをAny CPUにするとコンパイルできるのですが、
それですとやはりMTからはエラーが出て読み込めませんでした。

エラー内容から検索すると、海外では似たような症状が何とか出てきたのですが具体的な解決方法は無いようでした。

関係が無いとは思いますが、Cドライブの容量がないせいか別のドライブにインストールされています。
インストール時に変更も出来ないため、後日容量を空けて試してみたいと思います。

どうも自分の環境の問題のようです。
これ以上はご迷惑かと思いますので、今試されている事が終わりましたら後は自分でもう少し調べてみます。
進展がありましたらご報告させて頂きます。

本当にありがとうございます。

Posted by コム at 2014年10月01日 16:05
>コムさん

こんばんは。

Win8.1 32bit VS2013で試してみましたら同じ症状になりました。
どうしてなのか分かりません。
RGiesecke.DllExport.targetsのDllExportAppDomainIsolatedTask内を何かするといいのかもしれませんが、よく分かりません。

https://github.com/renshawbay/pythonnet/issues/6
32/64bitの違いなんでしょうか。そんなことはないと思うのですが。。。

というわけで、今の私の知識では理由が分からないです。
お役に立てず、申し訳ありません。
またよろしくお願いします。ありがとうございました。
Posted by ロンド at 2014年10月01日 21:39
同じ症状です。

色々と調べたところ、2バイト文字が原因らしいです。
コンパネの言語設定で、「Unicode対応ではないプログラムの言語」を日本語から英語(米国)に変更してみてください。

私の場合これで解決しました。
Posted by smalldust at 2015年03月02日 00:43
>smalldustさん

コメントありがとうございます。
あーそうなんですね!!知りませんでした。
今度自分でもやってみます。
本当に助かりました。大感謝です。
Posted by ロンド at 2015年03月02日 01:06
記事とコメントが参考になりました!
書いてくださってありがとうございました!
Posted by at 2016年03月16日 18:39
>名無しさん

参考になってよかったです。
またよろしくお願いします。
Posted by ロンド at 2016年03月16日 21:58
すごく参考になりました!本当にありがとうございます!(^_^)/
Posted by callmekohei at 2016年08月13日 17:55
C#でできるならF#でもできるはず!ということで僕もF#でやってみたらできました!この記事に本当に助けられました!ありがとうございます!
http://callmekohei00.hatenablog.com/entry/2016/08/12/091008
Posted by callmekohei at 2016年08月13日 18:03
>callmekoheiさん

コメントありがとうございます。
お役に立ててよかったです。F#はやったことがないです。今度やってみます。
Posted by ロンド at 2016年08月13日 22:43
初めまして、C#でDLLを作成したく検索したらコチラに流れ着きました。

最新のVS2019での作成で試みたのですが開いたらウィンドウが落ちます。
そもそも、新規プロジェクト作成時にはC#でクラスを作成する場合の項目が複数ありどれを選べばいいのかもよくわからない・・・・

VS2019バージョンのやり方はどうでしょうか??
Posted by Makoto at 2019年12月21日 01:39
お手本ありがとうございます。
{{のエラーにもなりましたが順次処理して対応完了しました。
けどMT4から該当DLLにメソッドがねぇぞと怒られました。

public static int

public unsafe static int
に変更しプロパティでアンマネージドをクリック。

を追加したらVS2013,2017にて動作確認できました。

参考まで。
Posted by K at 2020年01月25日 17:37
コメントを書く
コチラをクリックしてください