回答編集履歴

3

追記

2016/07/26 23:22

投稿

Zuishin
Zuishin

スコア28662

test CHANGED
@@ -25,3 +25,115 @@
25
25
 
26
26
 
27
27
  該当 dll を読み込む別プロセスを用意して、その Process.StandardOutput をとればできるかもしれませんが、いずれにせよ面倒な手順が必要かもしれません。
28
+
29
+ ###追記(別プロセスを使った方法)
30
+
31
+ 次の C ソースをコンパイルして called.dll を作ります。
32
+
33
+ ```C
34
+
35
+ __declspec(dllexport) void main(void)
36
+
37
+ {
38
+
39
+ printf("%s\n", "Hello World!");
40
+
41
+ }
42
+
43
+ ```
44
+
45
+ 次の C# ソースから caller.exe を作ります。
46
+
47
+ これは C ソースから作られた dll のメソッドを呼び出すだけのプログラムです。
48
+
49
+ このソースからは C の main() を単純に呼び出すことしかできませんが、static void Main(string args[]) としてコマンドライン引数を与えることで他のメソッドにも対応できると思います。
50
+
51
+ ```C#
52
+
53
+ using System;
54
+
55
+ using System.Runtime.InteropServices;
56
+
57
+
58
+
59
+ static class Program
60
+
61
+ {
62
+
63
+ [STAThread]
64
+
65
+ static void Main()
66
+
67
+ {
68
+
69
+ main();
70
+
71
+ }
72
+
73
+
74
+
75
+ [DllImport(@"...\called.dll", CallingConvention=CallingConvention.StdCall)]
76
+
77
+ static extern void main();
78
+
79
+ }
80
+
81
+ ```
82
+
83
+ 次の C# ソースはアプリ本体です。
84
+
85
+ ```C#
86
+
87
+ using System;
88
+
89
+ using System.Diagnostics;
90
+
91
+ using System.Windows.Forms;
92
+
93
+
94
+
95
+ namespace WindowsFormsApplication1
96
+
97
+ {
98
+
99
+ public partial class Form1 : Form
100
+
101
+ {
102
+
103
+ public Form1()
104
+
105
+ {
106
+
107
+ InitializeComponent();
108
+
109
+ }
110
+
111
+
112
+
113
+ private void button1_Click(object sender, EventArgs e)
114
+
115
+ {
116
+
117
+ var processInfo = new ProcessStartInfo(@"...\caller.exe");
118
+
119
+ processInfo.RedirectStandardOutput = true;
120
+
121
+ processInfo.UseShellExecute = false;
122
+
123
+ var process = new Process();
124
+
125
+ process.StartInfo = processInfo;
126
+
127
+ process.Start();
128
+
129
+ textBox1.Text = process.StandardOutput.ReadLine();
130
+
131
+ }
132
+
133
+ }
134
+
135
+ }
136
+
137
+ ```
138
+
139
+ 以上で、一番下のアプリのテキストボックスに文字が入ることを確認しました。

2

修正

2016/07/26 23:22

投稿

Zuishin
Zuishin

スコア28662

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ###追記
18
18
 
19
- 上記でできるだろうと思っていたのですが、実際に確かめてみると無理でした。
19
+ 上記でできるので、printf も可能だろうと思っていたのですが、実際に確かめてみると無理でした。
20
20
 
21
21
 
22
22
 

1

追記

2016/07/26 13:48

投稿

Zuishin
Zuishin

スコア28662

test CHANGED
@@ -13,3 +13,15 @@
13
13
  textBox1.Text = sb.ToString();
14
14
 
15
15
  ```
16
+
17
+ ###追記
18
+
19
+ 上記でできるだろうと思っていたのですが、実際に確かめてみると無理でした。
20
+
21
+
22
+
23
+ [DLL内のprintf()による出力を得たい](http://dobon.net/vb/bbs/log3-38/23206.html)は、ご本人かもしれませんが、全く同じ問題ですね。
24
+
25
+
26
+
27
+ 該当 dll を読み込む別プロセスを用意して、その Process.StandardOutput をとればできるかもしれませんが、いずれにせよ面倒な手順が必要かもしれません。