C++ Struct in C# -



C++ Struct in C# -

i'm using dll written in c++ in c# project using dllimport , 1 of functions i'm using looks this:

[dllimport("dds.dll", charset = charset.auto)] private static extern int par( ddtableresults2 tableresult, ref parresults parresult, int vul );

the parresults struct defined in c++ this:

struct parresults { /* index = 0 ns view , index = 1 ew view. 'view' here meant side starts bidding. */ char parscore[2][16]; char parcontractsstring[2][128]; };

the start of c++ function

int stdcall par(struct ddtableresults * tablep, struct parresults *presp, int vulnerable)

how should define above struct in c# able send struct en reference dll function?

this have tried don't work @ , access violation error

[structlayout(layoutkind.sequential)] public struct parresults { [marshalas(unmanagedtype.byvalarray, sizeconst = 32)] public char[,] parscore; [marshalas(unmanagedtype.byvalarray, sizeconst = 256)] public char[,] parcontractsstring; public parresults(int x) { parscore = new char[2,16]; parcontractsstring = new char[2,128]; } }

this quite tricky struct marshal in c#. there various ways effort it, think cleanest represent character arrays byte arrays , marshal , strings hand. here demonstration of mean:

c++

#include <cstring> struct parresults { char parscore[2][16]; char parcontractsstring[2][128]; }; extern "c" { __declspec(dllexport) void foo(struct parresults *res) { strcpy(res->parscore[0], res->parcontractsstring[0]); strcpy(res->parscore[1], res->parcontractsstring[1]); } }

c#

using system; using system.text; using system.runtime.interopservices; namespace consoleapplication1 { class programme { [structlayout(layoutkind.sequential)] class parresults { private const int parscorecount = 2; private const int parscorelen = 16; private const int parcontractsstringcount = 2; private const int parcontractsstringlen = 128; [marshalas(unmanagedtype.byvalarray, sizeconst = parscorecount * parscorelen)] private byte[] parscorebuff; [marshalas(unmanagedtype.byvalarray, sizeconst = parcontractsstringcount * parcontractsstringlen)] private byte[] parcontractsstringbuff; public string getparscore(int index) { string str = encoding.default.getstring(parscorebuff, index * parscorelen, parscorelen); int len = str.indexof('\0'); if (len != -1) str = str.substring(0, len); homecoming str; } public void setparscore(int index, string value) { byte[] bytes = encoding.default.getbytes(value); int len = math.min(bytes.length, parscorelen); array.copy(bytes, 0, parscorebuff, index * parscorelen, len); array.clear(parscorebuff, index * parscorelen + len, parscorelen - len); } public string parcontractsstring(int index) { string str = encoding.default.getstring(parcontractsstringbuff, index * parcontractsstringlen, parcontractsstringlen); int len = str.indexof('\0'); if (len != -1) str = str.substring(0, len); homecoming str; } public void setparcontractsstring(int index, string value) { byte[] bytes = encoding.default.getbytes(value); int len = math.min(bytes.length, parcontractsstringlen); array.copy(bytes, 0, parcontractsstringbuff, index * parcontractsstringlen, len); array.clear(parcontractsstringbuff, index * parcontractsstringlen + len, parcontractsstringlen - len); } public parresults() { parscorebuff = new byte[parscorecount * parscorelen]; parcontractsstringbuff = new byte[parcontractsstringcount * parcontractsstringlen]; } }; [dllimport(@"...", callingconvention = callingconvention.cdecl)] static extern void foo([in,out] parresults res); static void main(string[] args) { parresults res = new parresults(); res.setparcontractsstring(0, "foo"); res.setparcontractsstring(1, "bar"); foo(res); console.writeline(res.getparscore(0)); console.writeline(res.getparscore(1)); console.readline(); } } }

here i've used class represent struct. since class in c# reference, don't declare parameters of type ref. i've used __cdecl convenience avoid having work out decorated name of function be. library used __stdcall , need stick that.

the class demonstrates sending info in both directions. simplify code if info flow more restricted.

c# c++ struct pinvoke dllimport

Comments

Popular posts from this blog

xslt - DocBook 5 to PDF transform failing with error: "fo:flow" is missing child elements. Required content model: marker* -

mediawiki - How do I insert tables inside infoboxes on Wikia pages? -

Local Service User Logged into Windows -