// C++/CLIでWrapperライブラリを書きたい時用サンプル // wrapper.h #pragma once using namespace System; namespace wrapper { public ref class Wrapper { // TODO: このクラスの、ユーザーのメソッドをここに追加してください。 public: static int TestFunc(System::String ^%s, int n);//staticをつけることで、スタティックメソッドとして扱われる。 }; } // wrapper.cpp #include "stdafx.h" #include "testlib.h" #include using namespace wrapper; using namespace System; using namespace System::Runtime::InteropServices; extern "C" { int test_func(char *p, int n){ memset(p, 'a', n); p[n] = '\0'; return 0; } } int Wrapper::TestFunc(System::String ^%s, int n) { //%sとすることで参照渡しとなる。ByRef相当。 IntPtr ptr = Marshal::AllocCoTaskMem(n+1);//malloc相当。アンマネージド領域を確保。 test_func((char *)ptr.ToPointer(), n);//.ToPointer()でアンマネージドなポインタを得る s = Marshal::PtrToStringAnsi(ptr);//Stringに変換 Marshal::FreeCoTaskMem(ptr);//free相当 return 0; } // 上のライブラリをVB.NETから参照するとき // 同じソリューション内に新規プロジェクトとしてWindowsFormsApplicationとして作成。作成したプロジェクトをスタートアッププロジェクトとして指定すると、ライブラリも一緒にデバッグできる。 // Form1にTextBoxとButtonを配置。テキストボックスに数字を入力すると、上のライブラリで数字の数だけaが出力されるので、メッセージボックスで表示する。 /* Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim teststr As String wrapper.Wrapper.TestFunc(teststr, CInt(TextBox1.Text)) MessageBox.Show(teststr) End Sub End Class */