VCのDLLをC#から呼び出すには

VCで作られたDLLを、C#から参照したいときの方法。

構造体をやり取りすると想定して、
その場合の方法は以下のとおり。

--------------------------------------------------------------------------
VC側(DLLとなる側)
--------------------------------------------------------------------------
// 構造体を仮定
typedef struct typstrData{
char strMsg[256];
int sw;
char strStok[128];
int sw2;
}TYPESDATA;
// dll側の領域
static TYPESDATA stockdt[5];
static int stockidx=0;

// DLL側関数の例として以下のような2関数を用意していたとする
// データをDLL側に渡す関数(stock_pushd)
int WINAPI stock_pushd(TYPESDATA *psetdt)
{
if( 4<stockidx) return -1;
memcpy(&stockdt[stockidx++],
               psetdt,sizeof(TYPESDATA));
return stockidx;
}
// DLL側からデータを受け取る関数(stock_popd)
int WINAPI stock_popd(TYPESDATA *psetdt)
{
if( 0==stockidx) return -1;
memcpy(psetdt,&stockdt[--stockidx],sizeof(TYPESDATA));
return stockidx+1;
}
--------------------------------------------------------------------------
C#側
--------------------------------------------------------------------------

using System;
using System.Runtime.InteropServices;

namespace TestCSharp
{
// C#側プログラムで実際に使用するデータ用クラス
public class csData
{
public string message;
public int sw1;
public string Stock;
public int sw2;
public csData(){
message = string.Empty;
sw1=0;
Stock=string.Empty;
sw2=0;
}
}

// C#側で、DLLとやり取りを行うクラス
public class testdllApi
{
//----------------------------------------------------------
//構造体定義
//----------------------------------------------------------
// typedef struct typstrData
// {
// char strMsg[256];
// int sw;
// char strStok[128];
// int sw2;
// }TYPESDATA;
// この構造体と同じレイアウトにするには以下のような記述
[StructLayout(LayoutKind.Sequential)]
public struct dll_TYPESDATA
{
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = (int)256)]
public string strMsg;
public int sw;
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = (int)128)]
public string strStok;
public int sw2;
}
//----------------------------------------------------------
// 関数定義
//----------------------------------------------------------
// DLL側の関数を使用できるように定義
[System.Runtime.InteropServices.DllImport("testdll.dll")]
public static extern System.Int32
stock_pushd(ref dll_TYPESDATA psetdt);
[System.Runtime.InteropServices.DllImport("testdll.dll")]
public static extern System.Int32
stock_popd(ref dll_TYPESDATA psetdt);
//----------------------------------------------------------
public testdllApi() { /* コンストラクタ */ }
// C#側ではこのメソッドを使用する(pushd)
public int pushd(csData pdt)
{
dll_TYPESDATA dt = new dll_TYPESDATA);
dt.strMsg = pdt.message;
dt.sw = pdt.sw1;
dt.sw2 = pdt.sw2;
dt.strStok = pdt.Stock;
int nans = stock_pushd(ref dt);
return nans;
}
// C#側ではこのメソッドを使用する(popd)
public int popd(ref csData pdt)
{
dll_TYPESDATA dt = new dll_TYPESDATA();
int nans = stock_popd(ref dt);
pdt.message = dt.strMsg ;
pdt.sw1 = dt.sw;
pdt.sw2 = dt.sw2;
pdt.Stock = dt.strStok;
return nans;
}
}
}

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

興味

項目(サイトへ)概要
AIと仕事の未来生成AIによる働き方の変化と、これから求められる仕事・スキル・キャリアを探るレポートです。
SVGタグ解説SVGの基本的なタグについて解説します。
SVGの探求SVG:インタラクティビティとアニメーションの探求
Mermaid.js 各種ダイアグラムのノードと矢印の図形Mermaid.jsは、コードベースでフローチャートやUMLなどの図を描画できる軽量なJavaScriptライブラリです。
Mermaid.js 記述事例Mermaid.jsを使用してフローチャート、シーケンス図、クラス図、ステート図、マインドマップ、要件定義を記述した構文例を載せています。
macromedia Flash 歴史探訪Webに命を吹き込んだFlash──インタラクティブ時代の幕開けを振り返ります。
RailsがWeb開発にもたらした衝撃と改革Web開発の革命、多くのフレームワーク誕生の火付け役となったRuby on Railsについて。
IT開発工数見積もり手法 選定支援ツール要件定義は工数見積の基盤であり、適切な算出が成功の鍵となります。
梅から桜へ:日本の花文化変遷インタラクティブガイド梅から桜へと観賞対象が移り変わった歴史的経緯と文化的背景を、インタラクティブに探求します。
もち麦と雑穀米 完全ガイドもち麦と雑穀米のインタラクティブガイドです。

no+e

記事内容
SVG描画ツールを作ってみたSVG描画ツールをGeminiと共に作るきっかけとなった話
GeminiとMermaid.jsの組み合わせGeminiで、ソースを解析してもらいmermaid.jsが認識してくれるタグに変換してもらう話
Gemini共同製作からのGem活用Geminiと私が実際に行っている共同製作方法(バイブコーディング)の方法を解説した話
SVG描画ツールをGemini CLIで作成するGemini CLIでSVG描画ツールを作成できるのか?を確認した話
KIROを使ってみました。KIROというAIエージェントが公開されてGemini CLI が解決できない問題を解決できるのではと使ってみた話
KIROとGeminiでSVG描画ツールを作成本当はGEMINI CLIを1番に使いたいのですが使えないのです。その為現在は、1.KIRO 2.GEMINI(WEB) 3.GEMINI CLI を使ってます
AIが「ごめんなさい」と答えた日。私は気分転換をすることにしたSVG描画ツールのバグ修正が思うように進まず、開発がしばらく停滞した中、生成AIにも見放されてしまい気分転換をした話