[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 03/14 21:05 / Filesize : 161 KB / Number-of Response : 689
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

ふらっとC#,C♯,C#(初心者用) Part26



1 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 11:07:29 ]
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

前スレ

ふらっとC#,C♯,C#(初心者用) Part25
pc11.2ch.net/test/read.cgi/tech/1204104280/

493 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:04:03 ]
そのためにvarがあるんだが

494 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:07:10 ]
冗長だな。

495 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:08:40 ]
>>485
メリット以前にC#でDirectX直触りするんならレガシーのぞいてオフィシャルは
XNAしか茄子。

本当に直触りも出来るけど素人お断り&とても大変&あれ以上の完成度
難しい。…まあXnaがかなりよく考えて作られてるってことだが

496 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:12:24 ]
>>484
2.0からEE縛り消えた。C#のみサポート縛りは確かあり

497 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:13:55 ]
>>495
なるる。なんかWikiみるとXNAにはフレームワークも用意されてるっぽいし、
サンプルが充実してそうでつね。ぱっとみ気になるのは

「日本語の表示が非常に難しい」
「ジョイパッドはXBOX360コントローラーだけ」

ってところかな?wまぁ実際触ってみます。

498 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:29:15 ]
>>497
SpriteFont出来たから日本語の表示は楽になった。ビルドに時間かかるぐらい。
というか文字表示はDirectX使うならどっちにしろ大変。SpriteFontは
かなりいい落とし所。

DInputはMarshalingに慣れてる人なら直で触ってもサクッと書けてしまう
ぐらいのコード量かと。全機能綺麗にと言われたらちょっと大変かもだが

499 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:58:33 ]
遅延バインディングっていうのかな?
XMLにButton1を押した時にはC:\XXX\AAA.dllのBBB.bbbクラスのcccってメソッドを呼ぶ
ってな感じで記入して、記入した内容を元にプログラムを実行したいです。。
XMLを書き換えればソースを書き換えなくても動くようにしたいんです。
まだまだC#はかじったばかりですが、どのあたりを勉強すればいいですか?

検索のキーワードとか、ヘルプで見るネームスペースとかだけでもいいから教えてください。

500 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 00:17:34 ]
>>498
なるほー。情報マジどもです(__)
XNAさわりまくってみまつ。

501 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 01:03:57 ]
SystemBrushes.Highlight から取得したブラシを
使い終わった後でDisposeしようとしたら下記の例外が発生しました。

System.ArgumentException はユーザー コードによってハンドルされませんでした。
Message="アクセス許可が有効でないため、Brush を変更できません。"
Source="System.Drawing"


SystemBrushesから取得したブラシはDisposeしてはいけないのでしょうか。# パフォーマンス上の理由?
それとも何か重大な勘違いをしているのでしょうか。



502 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 09:16:29 ]
>>501
自分で作ってないものは破棄しちゃ駄目、というのが原則。

503 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 10:24:02 ]
>>502
なるほど次から気をつけます。

504 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 10:28:01 ]
>>499
WPF(XAML)なら標準でできる
WinFormsならリフレクションを駆使して自力で頑張る

505 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 10:58:23 ]
>>501
まあプロパティで取得するオブジェクトだから、中の人がCloneを返すようにしていたならば当然Disposeして
問題ないのだが(むしろしないとまずい)、おそらく中の人はそのまんま参照を返しているみたいなので
その例外が出たんだろうね。
要するに他にもいろんなところで使われているオブジェクトの参照なので勝手にDisposeしてはいけないということかな。
仮にそのオブジェクトを変更したりする必要が出てくるような場合はCloneを受け取ればよい。

using (var sb = SystemBrushes.Highlight.Clone() as SolidBrush)
{
  Hoge();
}

これなら例外発生しない。

506 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 11:25:44 ]
>>505
あーなるほど、中ではそういう事になってるんですね
ありがとうございます。とても参考になりました

507 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 13:17:50 ]
質問。

超初心者で、まずハロワのプログラム書いたんだけど、SDKでコンパルして
.exeのやつ作って実行しても何か黒い画面が一瞬表示されるだけで何書いてるかも
読めない。これって俺の書いたのが悪いのか?メッセージループ?か何か使ってないから?

508 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 13:20:34 ]
>>507
コマンドプロンプトから実行

509 名前:507 mailto:sage [2008/04/04(金) 13:33:59 ]
SDK コマンドプロンプトから実行したらできた!
ありがとう>>508

510 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 17:07:42 ]
すみません、質問よろしいでしょうか。

C#でスクリーンセーバーを一時無効化する事って出来るんでしょうか?
マウスポインタを強制的に動かす方法くらいしか思いつきません。
又その場合、実際のマウス操作と認識して無操作時間がリセットされるのでしょうか?

どなたかお力をお貸し下さい。お願いします

511 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 17:48:04 ]
TabControl上に配置したTextBoxにtextBox1.Text == "Text;"
というように文字列を表示しようとすると
「静的でないフィールド、メソッド、・・・でオブジェクト参照が必要です」
とエラーになってしまうのですが、どのようにすればいいですか?



512 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:03:38 ]
511 が 記述ミスでありますように…




513 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:29:40 ]
; ; ; ; ;

514 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 19:14:11 ]
2つ

515 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 20:20:47 ]
常駐プログラムって、どうやったらできるの??

516 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 20:27:34 ]
普通のプログラムだよ 特別なことは何も無い

517 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 20:44:16 ]
タスクトレイの事かな

518 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 20:54:26 ]
サービスじゃね

519 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:48:42 ]
VB.NETとC#の演算子の違いに戸惑っています。

VB.NETで

Dim FileName As String = "C:\WINDOWS\system32\xvid.ax"
If IO.Path.GetExtension(FileName).ToLower <> ".dll" Then
  Console.WriteLine("DLLじゃないよ")
End If

は出来るのにC#で

string FileName = @"C:\WINDOWS\system32\xvid.ax";
if (System.IO.Path.GetExtension(FileName).ToLower != ".dll") {
  Console.WriteLine("DLLじゃないよ");
}

と出来ないのは何故でしょうか。
また、VB.NETと同じように処理可能にする方法はないでしょうか。

520 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:54:11 ]
C#ではメソッド呼び出しの括弧は省略できないからToLower()と書く必要がある
VBでも括弧は省略しない癖を付けた方が…

521 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:59:45 ]
>>520
orz

こんな単純ミスだったんですね…。
VB.NETの場合、"()"が必要な場合はインテリセンスが自動補完してくれるので気付きませんでした。
これからは気を付けます。



522 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:28:04 ]
>>504
その自力で頑張るの部分をもう少し詳しくお願いできませんか?
System.Windows.Forms.Formを使用してます。

523 名前:510 mailto:sage [2008/04/05(土) 00:33:58 ]
どうかお願いいたします。

524 名前:デフォルトの名無しさん [2008/04/05(土) 01:56:53 ]
TableLayoutPanelからコントロールを取り除くとき

for (int i = 34; 7 <= i; i--)
{
  tlp.Controls.RemoveAt(i);
}

のように後ろからやっていく方法と

for (int i = 34; 7 <= i; i--)
{
  tlp.Controls.RemoveAt(0);
}

のように前からやっていく方法とで、どちらかのほうがいいということはありますか?
それとも、たいした違いはありませんか?

525 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 02:02:56 ]
後者は
for (int i = 34; 7 <= i; i--)
{
  tlp.Controls.RemoveAt(7);
}
でした、すみません

526 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 02:37:55 ]
C#のフォームを使うプログラムで、複数フォームにまたがるデータは、
どこに格納するのが慣例なのでしょうか?

VBではモジュールがよさそうですが。

527 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 02:48:47 ]
1. Application クラスの public static フィールド
2. フォームのコンストラクタで渡して使う
3. Form.Show の前にプロパティで渡す

528 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:02:56 ]
こういう場合はどうやって変換したら良いのでしょうか?
obj = new (???) c;
それとも、こういう使い方をしてはいけないのでしょうか?

public class A
{
public A()
{
new B(this);
}

public A_C()
{
//
}
}

public class B
{
public B(object c)
{
c.A_C(); // ← こういう雰囲気の事をしたい
}
}

529 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:09:47 ]
キャストすればいいんじゃね?

530 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:24:51 ]
なんでobjectで受け取ってるのかが問題だな

531 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:30:23 ]
そのキャストの仕方や受け取り方がわからない
Listview lv = (ListView) sender;とかと同じ理屈だとは思うのですが・・・
()の中に何を入れてよいのかわかりません



532 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:33:31 ]
Aだろ。

533 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:39:04 ]
あぁ、一生懸命classとか入れていました・・・。
例えばこのobjectがどのクラスか不明だった場合はどうしたら良いのでしょうか?

534 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:41:59 ]
どうしたいんだよ?

535 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:43:13 ]
先にc#の仕様を一通り理解すれば全て解決するパターンだな。

536 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:53:20 ]
>>533
どのクラスか不明って少なくともA_C()を実装してるクラスが一番の大元だろう?
そのクラスにキャストしれ
っつか、そのクラスで受け取れよ。

537 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:57:37 ]
というか、そもそも何をしたいのかがよくわからん。

538 名前:533 mailto:sage [2008/04/05(土) 10:03:27 ]
えっと、自分が使いやすいようにまとめてある非同期ダウンロードのライブラリ的なものがありまして
ダウンロード完了時のイベントを呼び出し元で側で受け取りたいのです。
感じとしては以下のような形です。

public Download(string uri, string filepath,object obj)
{
if (dc == null)
{
dc = new WebClient();
dc.DownloadFileCompleted += new AsyncCompletedEventHandler(obj.DownloadCompleted);
}
dc.DownloadFileAsync(new Uri(uri), filepath);
}


539 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 10:07:20 ]
objectじゃなくてAsyncCompletedEventHandler受け取れば済む話じゃね?
つか普通そのオブジェクトがイベントを伝播する形にするんじゃね?

540 名前:533 mailto:sage [2008/04/05(土) 10:16:03 ]
言葉を知らないから説明できない
もやっとぼーるを投げます
お騒がせしました

541 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 10:43:33 ]
よくわからんが特定のメソッドを呼び出したいんだと予想。
で、いろんなパターンがあって、全てのクラスに共通する基本クラスは作成できないと解釈。

呼び出したいメソッドを定義したインターフェイスを作って、
それぞれのクラスでそのインターフェイスを実装。
メソッドのパラメータはそのインターフェイスの型の型にする。

デリゲートで使えるかどうかはしらん



542 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 11:30:10 ]
デリゲートかイベントで十分

543 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 11:31:47 ]
>>538
MethodInfoあたりでも使えば、問答無用で好き放題できるだろうけど
その前に可能であればC#らしいスタイルを追求したいと思う自分がいる。

1.呼び出してほしいインターフェイスを定義して、呼び出されたいクラスが実装する。
 Downloadが完了次第、Downloadを持つクラスがそれを呼び出す。
 参照が無くなったりDisposeされたりといった問題があるなら、それを加えてもう一度やりたい事をここで説明。

2.主従関係を逆転して考えてみる。
 Download を持つクラスに event を定義して、呼び出されたいクラスがコンストラクタ等で自ら登録する。

3.MethodInfo を使って、まさに当初の質問通りの処理をする。

544 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 11:44:05 ]
この辺読め
msdn2.microsoft.com/ja-jp/library/ms228969(VS.80).aspx

545 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:17:31 ]
アンマネージドのC++で作ったDLLの関数をC#で使いたいのですが
DLL 'testdll.dll' の 'f'' というエントリ ポイントが見つかりません。
と例外が出てしまいます。
やり方が間違っているのでしょうか?
DLL側は
class c
{
 public:
 static __declspec(dllexport) int f();
};
int c::f()
{
 return 777;
}
C#側は
using System.Runtime.InteropServices;
using System;
namespace ConsoleApplication1
{
 class Program
 {
  [DllImport("testdll.dll")]
  public static extern int f();
  static void Main(string[] args)
  {
   Console.WriteLine(f());
  }
 }
}
こんな感じになってます。
testdll.dllとtestdll.libはC#側のフォルダに入れてます。

546 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:28:20 ]
>>545
C++側のインターフェイスをCスタイルで書いてextern "C" とする。
C++の識別子は、どのようなスタイルになるのかはアンマネージドの範囲でも一切保障されない。

547 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:33:31 ]
>>545
C++側をcomで作って、C#側はプロジェクトの参照設定よりdllを追加(COMタブより追加可能)

548 名前:533 mailto:sage [2008/04/05(土) 12:44:25 ]
主従関係に困惑したりしながら色々と試行錯誤していたのですが読み出す時にイベントを付加する事にしました。
でも、今度は何のダウンロードが完了したのかわからない。未だに見慣れないのですがMSDNと格闘してきます!。

AsyncCompletedEventHandler e = new AsyncCompletedEventHandler(this.DownloadCompleted);
FileDownload(path, filepath, e);

public void DownloadCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
System.Net.WebClient m = (System.Net.WebClient)sender;
//m.download_url = ???
}



549 名前:545 mailto:sage [2008/04/05(土) 12:49:16 ]
>>546
extern "C"{
 __declspec(dllexport) int f()
 {
  return 777;
 }
}
DLLをこう書き直したのですが結果は変わりませんでした。
これはCスタイルではないって事でしょうか??

550 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:53:07 ]
__stdcall

551 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:54:55 ]
>>549
CallingConventionを合わせる



552 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:58:28 ]
>>548
まずC++をしっかり勉強してからの方が無難かもしれないね。

553 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 12:59:29 ]
>>552 はアンカミス >>548 -> >>549

554 名前:545 mailto:sage [2008/04/05(土) 13:47:47 ]
>>550
extern "C"
{
 int __declspec(dllexport) __stdcall f();
}
int __declspec(dllexport) __stdcall f()
{
 return 777;
}
DLLをこう変更しましたがだめでした。
DLL側のコードを書いてくれませんか?

555 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 13:57:53 ]
とりあえずCOMとIDLについて軽く勉強した方がよくね

556 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:05:22 ]
P/InvokeにCOMもIDLも関係ないだろ。適当教えるなよ

557 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:09:12 ]
dumpbin /exports
でdll調べてみたら

558 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:10:40 ]
>>554
C:\>type test.cpp
extern "C" __declspec(dllexport) int f() {
return 777;
}

C:\>type test.cs
using System;
using System.Runtime.InteropServices;
namespace Test {
class Test {
[DllImport("test", CallingConvention=CallingConvention.Cdecl)]
static extern int f();
static void Main() {
Console.WriteLine(f());
}
}
}

C:\>cl /LD /nologo test.cpp
test.cpp
ライブラリ test.lib とオブジェクト test.exp を作成中

C:\>csc /nologo test.cs

C:\>test
777

559 名前:545 mailto:sage [2008/04/05(土) 16:14:51 ]
>>558
/nologoと付けたら出来ましたが、IDEからビルドすると例外エラーです。
皆さんはアンマネージドのC++でDLLを作ってC#とかから呼び出したりしないんですか?

560 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:21:03 ]
>>559
ふつーは .def 使ってエクスポート名をきちんとしておく。

561 名前:560 mailto:sage [2008/04/05(土) 16:27:33 ]
つまりこういうことな。

//test.cpp
extern "C" int __stdcall f() {
 return 777;
}

//test.def
LIBRARY
EXPORTS
 f

//test.cs
[DllImport("test.dll")]
int f();





562 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:31:31 ]
>>559
俺だったらC++/CLIで作る

563 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:55:54 ]
>>561
コンパイルすら通らないんですが。。
//test.cpp
extern "C" __declspec(dllexport) int f()
{
 return 777;
}
//test.def
LIBRARY "testdll"
EXPORTS
 f
//test.cs
using System;
using System.Runtime.InteropServices;
namespace Test
{
 class Test
 {
  [DllImport("testdll")]
  static extern int f();
  static void Main()
  {
   Console.WriteLine(f());
  }
}
こうですか?
それでも例外出ますね。


564 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:15:55 ]
>>563
あーごめんC#側で extern と static いるの忘れてた

とりあえずそのコードだとC側の呼び出し規約が間違ってる。def使う場合
dllexportはいらない

565 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:19:39 ]
まずは、dumpbin 使え。

566 名前:564 mailto:sage [2008/04/05(土) 17:20:20 ]
ごめんもう一個
.defはリンカの設定に追加する必要がある。VSは作ったら勝手にやって
くれた気もするが

567 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:21:52 ]
>>565
Dependency Walkerでもいいけどな

568 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:51:54 ]
>>566
モジュール定義ファイルにtest.defを追加すればいいんですかね??
それでもビルド出来ないんですが。。
error C3872: '0x3000': この文字を識別子で使用することはできません
error C2065: ' return' : 定義されていない識別子です。
error C2143: 構文エラー : ';' が '定数' の前にありません。

569 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:53:19 ]
一行ヒントしか書かないやつは分からないのに答えてる法則。
そしてその後に関連される単語が出てくると「だから>>○○で言っただろ」と得意気な顔をするw

570 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:55:23 ]
>>568
それ全角スペースだろ死ねよ。

571 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:59:11 ]
まじ、dumpbin知らないってことか?
DLLの情報見れば解決する話だろうが。



572 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:00:06 ]
1行ヒントはクグればすぐ分かるということだろう。

573 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:05:55 ]
たった1行のコマンド実行するだけなのに、無視する理由が分からん。

574 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:08:43 ]
>>568
そこかよorz
そのコードインデントに全角スペース使ってるからインデントは
そのままコピペするんじゃなくてタブか半角スペースにきちんと
置換してくれ

>>571
dumpbin 使おうが Dependency Walker 使おうがエクスポートされた
名前は見れるけど、「どうやってその名前を作るの」がわからない、
つまり確認しか出来ないから直接解決にならんだろ
まぁそれらを知っておいてかつ確認ぐらいはしてほしいがマジで
まぁふらっとだから

575 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:15:20 ]
>>573
全角スペースを使うぐらいだから、コマンドプロンプトの使い方が分からないんだよ。

>>574
その名前で呼び出せば使えるんだから、命名規則の仕様まで分からなくてもいいと思うが。

576 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:18:13 ]
>>575
あそっか。C#側いじればいいのか。

577 名前:545 mailto:sage [2008/04/05(土) 18:20:34 ]
>>574
ありゃ。恥ずかしい><
全角混じってるだけでした。
ですがC#側で呼び出せません。。
むぅ…

578 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:21:56 ]
>>577
だから呼び出し規則あわせろってずっと言ってるだろ。
今のコード貼ってみろよ

579 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:22:12 ]
>>575
それじゃ根本的な解決になってないだろ

580 名前:545 mailto:sage [2008/04/05(土) 18:25:29 ]
>>578
どこでそんなこと書いてありますか?
//test.cpp
extern "C" int __stdcall f()
{
 return 777;
}
//test.def
LIBRARY
EXPORTS
f
//test.cs
using System;
using System.Runtime.InteropServices;
namespace Test
{
 class Test
 {
  [DllImport("test.dll")]
  static extern int f();
  static void Main()
  {
   Console.WriteLine(f());
  }
}
今のコードはこうです。
DLL側とC#側のコード貼ってください。

581 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:26:44 ]
動けばいいんじゃないの?



582 名前:545 mailto:sage [2008/04/05(土) 18:28:05 ]
C++で作ったDLLをC#で呼び出すときに皆さんはわざわざコマンドプロンプトを使うんですか?
ツールを使って名前を調べて呼び出したりするんですか?

583 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:29:42 ]
こいつ何言ってんだ。DLL中身みないでどうやって名前調べるんだよ。
もしかしてスピリュアルってやつ?

584 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:35:34 ]
>>582
当たり前だろ。

dumpbin /exports test.dll
の結果見せろよ。

585 名前:545 mailto:sage [2008/04/05(土) 18:38:41 ]
えと、何か勘違いしてるかもしれないのでご指摘ください。
イメージとしてはWin32APIを呼び出すときのように使いたいのです。
[DllImport("user32.dll")]
extern static int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY);
こんな感じで呼び出して利用できました。
なので自作のDLLも同じように出来るのかな?と思ったわけです。

C++のDLLをC++で呼び出したり、
C#のDLLをC#で呼び出すときは楽なのに、
マネージドからアンマネージドを呼び出すのは大変ですね…。

586 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:39:14 ]
>>584
あんまりいじめるな。
お前がコード張ればいいだろ。

587 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:39:34 ]
>>580
それコンパイルしたら普通に上手く動くぞ。
お前さんのやり方に問題があるとしか思えん。

588 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:40:29 ]
>>586
俺は>558ではった

589 名前:545 mailto:sage [2008/04/05(土) 18:42:49 ]
>>587
ありゃ。
もう一度新規プロジェクトからやり直して見ます!

590 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 18:46:35 ]
>>561 だが・・・うーん、これでexport 出来るはずなのよね。
別の原因の気がするので

・dumpbin の結果
 VS のコマンドプロンプト(たぶんスタートメニューのツールの
 下あたりにある)を起動して、生成した C++ な DLL に対して
 dumpbin /EXPORTS "test.dll"
 みたいにしてその結果を張ってください

・探索ロケーション周り
 当然 C# な exe と C な DLLは同じフォルダにないとダメですよ。

あたり確認してみてくれ

591 名前:545 mailto:sage [2008/04/05(土) 18:56:11 ]
>>590
両方ともプロジェクト作り直したら通りました;
dumpbinの結果は
File Type: DLL
Section contains the following exports for test.dll
00000000 characteristics
47F74A82 time date stamp Sat Apr 05 18:46:42 2008
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00001000 f = _f@0
Summary
1000 .data
1000 .rdata
1000 .reloc
1000 .rsrc
1000 .text
こんな感じでした。お騒がせしました><
DLLは作ったことないので色々いじって見ます。



592 名前:545 mailto:sage [2008/04/05(土) 18:59:29 ]
>>590
あ、すみません、言い忘れてました。
ありがとうございました!

593 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 19:01:31 ]
>>582
人の作ったDLLなら見る。
だって、C/C++のヘッダを見ただけでは分からないこと(修飾名)があるから。

WindowsシステムのDLLはそれがもう分かっているし、
585のように単純にDllImportを書くだけで使えるようになっているから見ない。

自分で作ったDLLも見ない。どうなっているかは自分で決めた通りなのだから、
調べるまでもない(思い通りになっているかを確認することはあるが)。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<161KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef