VS2010 C#からVC6で作成したDLLへint配列を引数として渡したい。
VC++6で作成されたDLLがあります。
ここで定義されている
int test(char*fname,int* x,int* y);
ファイルのフルパスを渡すと
返り値が関数の成否のコードを返す。
処理内で x,y
にファイルから読み込んだ値が
それぞれ上限100個としてセットして返す
といったような関数を
C#から呼び出したいのですが
1
[DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int test(IntPtr fname, ref int* x,ref int* y);
2
[DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int test(IntPtr fname, ref IntPtr x,ref IntPtr y);
と2種類の呼び出し方法をこころみました。
ファイルのフルパスは
IntPtr fnamePtr = Marshal.StringToHGlobalAnsi(string型ファイルフルパス);
としております。
1の場合は
int[] resX = new int[100];
int[] resY = new int[100];
fixed(int* x= resX)
fixed(int* x= resY)
として呼び出そうとすると
: エラー CS1657: '固定変数' であるため、'x' を ref または out 引数として渡せません
となり失敗してしまいます。
2
で試みた場合
int size = sizeof(int)*100;
IntPtr x = Marshal.AllocHGlobal(size);
IntPtr y = Marshal.AllocHGlobal(size);
と引き渡したところ
ビルドは通りますが
実行時に
System.AccessViolationException' のハンドルされていない例外が 発生しました。
追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
となってしまいます。
どのようにすれば思惑通りの結果を得られますでしょうか。
No.1ベストアンサー
- 回答日時:
難しく考えなくても出来るようですよ
[DllImports("DLL名", CharSet=CharSet.Ansi, EntryPoint="test")]
public static extrn int test( string fname, [Out] int[] xx, [Out] int[] yy );
と宣言して
int[] x = new int[100];
int[] y = new int[100];
int res = -2;
res = test( "ファイル名", x, y );
でOKみたいですよ …
unsafeにしなくても いいみたいですし
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java 配列<選挙> 4 2023/07/31 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
数字列を3桁ごとにカンマで区切...
-
比較回数と交換回数表示について
-
if と配列の組み合わせ
-
C言語で三目並べをするプログラ...
-
実数の整数部,小数部の取得
-
卒業研究でよく分からないとこ...
-
C言語で分からないところがあり...
-
C言語での奇数の和
-
アスタリスクで正方形
-
警告 W8065について。
-
入力された2つの整数の差を絶対...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
C言語
-
C言語初心者です、、、お助けく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報