C#(のIntPtr)を使用してリンクされたリスト構造は、C言語DLLと共に使用しました。

この資料の冒頭前に、私はそれは、リストの概念を説明する、または個人のリストについては、自身が構造を定義することによって、理解とポインタ変数の同じタイプを所有し、かつダイナミックなオープンメモリC言語で同様のダイナミックでも達成するために簡単にすることが必要だと思います機能的変異体の動的配列の長さ。
C言語は、.NETで、セキュリティ状況に直面しているオブジェクトの特性は、開発者が直接、すなわちメモリを操作することができないが、ポインタが、構造体のメンバシップタイプのその値を使用することができない、重要不可欠な構造のリストでありますボディタイプは、関数のリストは、直接達成することはできません。すべて完全に可能であるホスト環境、時には.NET開発者で管理されていないDLL書き言葉を参照する必要があります。C言語のDLLを使用する方法についての.Net文献はここで推奨http://my.oschina.net/bubifengyun/blog/96252この記事をたくさんされている、CLRの治安情勢の我々の詳細、C#リンクリスト構造を実装する方法マップやC DLLへ。
次のようにI MyDll.hコード:
#ifndefのLIB_H
の#define LIB_H
のtypedef構造体{体mystruct
INT MyVal;
体mystruct次に*;
}体mystruct。

extern "C" _declspec(のdllexport)体mystruct * GetStruct(体mystruct ST);
#endifの
私のMyDll.cpp次のコード:
の#include "stdafx.hを"
ファイルのようなの#include "MyDLL.h" //ルックスは、二つのヘッドを注文することはできません逆転。私は何度も試みたが、決定することはできません。
#include "STDLIB.H"
体mystruct
GetStruct(体mystruct ST){
(+ ST 1))= StateNum MyVal ++ ;.
体mystruct * MS、
MS =(体mystruct )はmalloc(1。のsizeof(体mystruct)); //オープン関数A内配列;
(MS *).MyVal = 2;
ST-> =次にMS; //対応する汎用のIntPtrアンマネージメモリアドレスへのポインタ
戻りST;
}

次のC#コード:
名前空間CDllInvoker {
パブリック構造体体mystruct {
公共のint MyVal;
公共のIntPtr次に;
}
[DLLIMPORT( "DLLInvoked.dll"、項目CharSet = CharSet.Auto、CallingConvention = CallingConvention.Cdecl)] //ここ言語DLL CなぜならプロジェクトDLLInvokedは、それは、DLLファイルDllInvoked.dll生成する
パブリック静的にexternのIntPtr GetStruct(REF体mystruct ST)を、
静的無効メイン(文字列[] args){
int型sizeOfmyStruct Marshal.SizeOf =(typeof演算(体mystruct));
体mystruct [ ] =新しい新しいSTARRAY体mystruct [10];
のIntPtr PTR = GetStruct(REF STARRAY [0]);
体mystruct次に=(体mystruct)Marshal.PtrToStructure(STARRAY [0] .NEXT、typeof演算(体mystruct));
Console.WriteLineを(次へ。 MyVal);
Console.Read();
}
}

发布了5 篇原创文章 · 获赞 3 · 访问量 2112

おすすめ

転載: blog.csdn.net/qq_26023835/article/details/104162727