.NET Framework エラー解決
Last-modified: 2007-07-26 (木) 15:39:58
コンパイル(コンパイラー)
error1192 (C1192)
- 原因
- VisualStudioのバグ。
参照設定にプロジェクトを追加した場合、実際に参照されるDLLはRelase/Debugモードによって本来は異なるはずである。しかしVisualStudio.NET2003では、Release/Debugモードの設定に関わらず“最初に参照設定したときに追加したDLL”をいつでも参照しようとする。これではReleaseモードで出荷したいにも関わらず、Debug版のDLLがくっつくということもありえる。
Debug時とRelease時で出力DLLファイル名/パス名が異なる場合などに起こる。
- 表示されるメッセージなど
- error C1192: #using failed on 'C:\MyProject\MyApp\debug\MyControl.dll'
- error C1192: #using failed on 'C:\MyProject\MyApp\release\MyControl.dll'
- 解決
- 参照設定から、当該のDLLを削除し、以下のように#usingする。
#using "MyControl.dll"
error2475 (C2475)
- 原因
- 不明
- 表示されるメッセージなど
- error C2475: 'MyClass::MyFunction' : pointer-to-member の形成には明示的なアドレス演算子 ('&') および限定名の使用が必要です。
- 解決1
- 関数呼び出しなのに、「MyFunction()」と書かず「MyFunction」のように括弧を忘れている可能性がある。引数がなくても括弧を付けましょう(括弧がないと関数呼び出しなのか何なのかがわかりにくいから・・という言語仕様かと思います)。
- 解決2
- デリゲートを使ってコールバック関数的にイベント関数を登録する際に、登録する関数にthisポインタを用いて関数を指定しようとした。thisポインタは不要です(原因は謎)。
リンク(リンカー)
LNK2020
- 原因
- 実装されていない関数が呼び出されている。
- 表示されるエラーメッセージなど
- error LNK2020: 未解決のトークン (06000007) YourClass::Init
YourClass.dll : fatal error LNK1136: ファイルが無効であるか、 または壊れています。
- 解決1
- 実装する
- 解決2
- ライブラリや関数の名前が間違えてないか確認する
- 解決3
- ライブラリが「/Zc:wchar_t」を使っていると、
ライブラリを使う側も同じオプションを入れる必要がある。
- 解決4
- ライブラリが、.NETクラスライブラリの場合、ヘッダに定義を書く。
ただし、それでは根本的な解決ではない。以下の「解決5」を参照。
- 解決5
- ライブラリが生成したDLLを「X.dll」とすると、
その問題のあったファイル、具体的にはヘッダファイルをインクルードしている
ソースファイルのところに以下の一文を追加する。
#using "x.dll"
こうすることで、問題は解決する。リンクの設定も不要。インクルードも不要。
ただし、実行時に同じパスの場所に同じ名前のDLLが必要となる。
絶対パスで書くのは絶対ダメ。相対パスも気をつける。
LNK2022
- 原因
- クラスのメンバを他のクラスに移した(staticなメンバをより広域なクラスに公開したとか)。バージョン管理ツール(VSS,Perforce,Subversion,CVS)を使っている。
- 表示されるエラーメッセージなど
- error LNK2022: メタデータの操作に失敗しました(80131188) : 重複する型に、適合しないフィールド宣言があります (型 : XXXXXXX.YYYYYYYY; フィールド : ffffffffffff): (0x0400006b)。
- 解決1
- リビルド
AL
- 原因
- ローカライズリソースファイル(hogehoge.ja.resXなど)がないとか。
- 表示されるメッセージなど
- エラーの結果が 'resgen.exe' より返されました。
- 解決1
- ソースを追加するとか、プロジェクトからはずすとか。
実行時エラー
ハンドルが無効です。
- 原因
- System.Diagnostics.ProcessにAttach、あるいはWaitForEndやHasExitを取得する場合に起こりえる。おそくら、いつのまにやらProcessクラスのデストラクタが呼ばれて関連づけられているハンドルのみが解放された模様。ハンドルが関連づけされているという情報は残っているし、もちろんプロセスも死んでいない。これは、ヤバイ。
- 表示されるエラーメッセージなど
- ハンドルが無効です。
- 解決策
- 不明
0xC0020001: その文字列結合は無効です。
- 原因
- 不明
- 表示されるエラーメッセージなど
- MyWindowsFormApplication.exeの00x7c812a5bでハンドルされていない例外が発生しました。: 0xC0020001: その文字列結合は無効です。
- 解決策1
- System.Environment.Exit(0)を使用せずに、System.Windows.Forms.Application.Exit()を使う。Environment.Exit()が「アプリケーションを強制終了する」のに対して、Application.Exit()は「Application.Run()のメインループを抜ける」というもの。この辺りに原因があるもよう。もしかしたら、エントリポイントを指定して、アパートメントをApartmentState.STAを設定していることも関係するかもしれない。
Setup Error
- 原因
- いくつかのパターンがある模様。ウェブではよく「スタックオーバーフロー(Stack overflow)」と書かれていたり、COM関連で「Tlbimp.exe」が原因とか書いてある。他にも「ライブラリとヘッダの不整合」などが考えられる。
- 表示されるエラーメッセージなど
- 「Failed to load resources from resource file. Please check your Setup.」デバッグ実行時は「'System.ExecutionEngineException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。」となる。