昨日は、C#だけでコーディングしたけど、今日は、’C’でDLLを作ってそれをC#から呼び出すようにした。
DLLのソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#pragma once #define Dll_Test_CPP_API __declspec(dllexport) typedef struct { double x; char y; } childT; typedef struct { int xx; childT* yy; } topT; extern "C" Dll_Test_CPP_API void testStruct(int a, double b, char c, topT* d); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include "pch.h" #include <stdio.h> #include <stdlib.h> #include "Dll_Test_CPP.h" void testStruct(int a, double b, char c, topT* d) { childT* ct; ct = d->yy; d->xx = a; ct->x = b; ct->y = c; } |
C#のソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace DllTestAPISharp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public struct childT { public double x; public char y; } public unsafe struct topT { public int xx; public childT* yy; } [DllImport("Dll_Test_CPP.dll", CallingConvention = CallingConvention.Cdecl)] private extern static void testStruct(int a, double b, char c, out topT d); private void button1_Click(object sender, EventArgs e) { textBox1.Text = "void testStruct(int a, double b, char c, out topT d)\r\n"; topT tT; childT cT; unsafe { tT.yy = &cT; } testStruct(10, 3.14, 'z', out tT); textBox1.Text = textBox1.Text + "tT.xx = "+tT.xx.ToString() + "\r\ncT.x = " + cT.x.ToString() + "\r\ncT.y = " + cT.y.ToString() + "\r\n"; } } } |
メンバに構造体へのポインタを持つ構造体のポインタを渡して、その構造体に引数の値を書き込むという簡単なサンプル。
unsafeを使ってやってみた。
本当は、unsafeはあまり使いたくないので、IntPtrを使う方法も試してみたい。
また、今使いたいAPIには、さらにポインタのポインタを引数に取る関数があるので、そっちの実験もしないと..。