C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: クリックを押すとエラーが出ます


(過去ログ 89 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■52784 / inTopicNo.1)  クリックを押すとエラーが出ます
  
□投稿者/ たいき (1回)-(2010/08/24(Tue) 15:04:59)

分類:[VB.NET/VB2005 以降] 

資産管理アプリを作っているのですが、
コンパイルするとエラーは出ないのですが警告で
"ReportList"はCLSに準拠していない"フォーム"から派生しているため、CLSに準拠していません。
WithEvents変数"USERINFO"はproperty"USERINFO"とベースClass"BASE"で競合しています。"Shadows"として宣言されなければなりません。
という2つのエラーがでます。
そして社内の資産を検索する画面で条件を指定して検索ボタンを押すと、
System.ApplicationExceptionのエラーが出てプログラムが終了してしまいます。

これだけでは全てのソースコードがないのでわからないと思いますが、これらのエラーはどういったときに起こるのか教えていただけないでしょうか?



引用返信 編集キー/
■52787 / inTopicNo.2)  Re[1]: クリックを押すとエラーが出ます
□投稿者/ マサヤ (114回)-(2010/08/24(Tue) 15:25:42)
"ReportList"はCLSに準拠していない"フォーム"から派生しているため、CLSに準拠していません。
→ReportListはこれは何のことでしょうか?

WithEvents変数"USERINFO"はproperty"USERINFO"とベースClass"BASE"で競合しています。"Shadows"として宣言されなければなりません。
という2つのエラーがでます。
→同じ名前の定数とかないでしょうか?Shadowsって何のことでしょうか?

そして社内の資産を検索する画面で条件を指定して検索ボタンを押すと、
System.ApplicationExceptionのエラーが出てプログラムが終了してしまいます。
→try CatchしてExceptionの中身を見てください。ブレークポイントはご存知でしょうか?
SQLが間違っているとか、クエリ結果の配列から値を取り出そうとしてない値を取り出そうとしてたりとかしないでしょうか?

総論としましては、これだけの情報で回答するのは相当厳しいです。
引用返信 編集キー/
■52788 / inTopicNo.3)  Re[1]: クリックを押すとエラーが出ます
□投稿者/ よねKEN (577回)-(2010/08/24(Tue) 15:30:02)
よねKEN さんの Web サイト
2010/08/24(Tue) 15:56:07 編集(投稿者)
2010/08/24(Tue) 15:41:52 編集(投稿者)

No52784 (たいき さん) に返信
> 資産管理アプリを作っているのですが、

たいきさんが作っている、ということかと思いますが、
1人で作られているのでしょうか?あるいは誰かが作ったプログラムを引き継いで開発されているのでしょうか?

> コンパイルするとエラーは出ないのですが警告で
> "ReportList"はCLSに準拠していない"フォーム"から派生しているため、CLSに準拠していません。

CLSとはCommon Language Specificationの略で、.NETでは複数の言語が利用できるため、
クラスライブラリを開発するような場合にどの言語からでも問題なく利用できるように開発する必要があり、
そのルールを定めたものです。(外部から利用されるライブラリ等でない場合は、気にしない、という選択もできますが、
本来は適切なコーディングをしていれば発生しないものです)

CLSに準拠しない一例としては、PublicなメンバーでUInteger型のパラメータや戻り値を使うような場合です。
.NET対応言語では、32bit符号無し整数型は必ずしも使える必要がないので、公開メンバーにUIntegerを使うような場合は、
CLSCompliant属性を使って、そのメンバーだけがCLS非準拠である旨を宣誓する必要があります。

CLS準拠の詳細については以下を参照してください。
http://msdn.microsoft.com/ja-jp/library/bhc3fa7f(VS.80).aspx

ところで、そのReportListクラスの継承元クラスは誰が作ったのでしょう?System.Windows.Forms.Formを継承して
作っている分にはそのような警告が出ることはないはずです。

#※追記
#"フォーム"という名前から継承元クラスはSystem.Windows.Forms.Formクラスの派生クラスかと思ったのですが、
#提供されている情報からでは判断できないですね。

> WithEvents変数"USERINFO"はproperty"USERINFO"とベースClass"BASE"で競合しています。"Shadows"として宣言されなければなりません。
> という2つのエラーがでます。

継承元クラスのBASEというクラスにUSERINFOという名前のプロパティがありますが、
今のクラスでもモジュールレベルの変数USERINFOを宣言して使おうとしているので競合している、という状況です。

USERINFOではなく別の名前の変数として宣言するべきなのか、あるいは、
そもそもは継承元のBASEクラスにあるUSERINFOを使わないといけないのに、
継承先クラスの開発者が継承元クラスの設計を正しく理解しておらずそうしていないだけなのか、
何をどう対処すべきかは仕様とクラス設計次第です。これが正解というものはありません。

> そして社内の資産を検索する画面で条件を指定して検索ボタンを押すと、
> System.ApplicationExceptionのエラーが出てプログラムが終了してしまいます。

そのプログラム固有の問題です。プログラム内でApplicationExceptionを独自にThrowしているとことがあるはずです。
そして、本来はその例外を目にすることはないようになっているはずだろうと思われるものですので、
どこかで不具合が起きているということです。
エラー(正確には例外)が表示されたときに、どこで例外が起きているのかを知るための情報として
スタックトレースが表示されているはずなので、そこから原因を究明してください。

引用返信 編集キー/
■52789 / inTopicNo.4)  Re[2]: クリックを押すとエラーが出ます
□投稿者/ よねKEN (578回)-(2010/08/24(Tue) 15:38:44)
よねKEN さんの Web サイト
No52787 (マサヤ さん) に返信
> WithEvents変数"USERINFO"はproperty"USERINFO"とベースClass"BASE"で競合しています。"Shadows"として宣言されなければなりません。
> という2つのエラーがでます。
> →同じ名前の定数とかないでしょうか?Shadowsって何のことでしょうか?

ShadowsはVisual Basicのキーワードです。(C#ではメンバーの宣言に付加するnewと同じ)
このメッセージは継承元と継承先に同名メンバーを定義しようとした場合で
継承元がオーバーライド可能でない場合に出るメッセージです。

> そして社内の資産を検索する画面で条件を指定して検索ボタンを押すと、
> System.ApplicationExceptionのエラーが出てプログラムが終了してしまいます。
> →try CatchしてExceptionの中身を見てください。ブレークポイントはご存知でしょうか?
> SQLが間違っているとか、クエリ結果の配列から値を取り出そうとしてない値を取り出そうとしてたりとかしないでしょうか?

System.ApplicationExceptionは.NET Frameworkのクラスライブラリでスローされることのない例外ですので、
独自にそのプログラムで例外を挙げられていると考えられます。

#.NET Framework1.x時代には、System.ApplicationExceptionクラスは個々のアプリケーションが
#独自に定義する例外の継承元として推奨されていたクラスです。今となっては使い物にならなくなった
#クラスのため、このクラスの使用は推奨されていません。

引用返信 編集キー/
■52790 / inTopicNo.5)  Re[3]: クリックを押すとエラーが出ます
□投稿者/ マサヤ (115回)-(2010/08/24(Tue) 15:58:17)
No52789 (よねKEN さん) に返信
> ■No52787 (マサヤ さん) に返信
>>WithEvents変数"USERINFO"はproperty"USERINFO"とベースClass"BASE"で競合しています。"Shadows"として宣言されなければなりません。
>>という2つのエラーがでます。
>>→同じ名前の定数とかないでしょうか?Shadowsって何のことでしょうか?
>
> ShadowsはVisual Basicのキーワードです。(C#ではメンバーの宣言に付加するnewと同じ)
> このメッセージは継承元と継承先に同名メンバーを定義しようとした場合で
> 継承元がオーバーライド可能でない場合に出るメッセージです。
>
>>そして社内の資産を検索する画面で条件を指定して検索ボタンを押すと、
>>System.ApplicationExceptionのエラーが出てプログラムが終了してしまいます。
>>→try CatchしてExceptionの中身を見てください。ブレークポイントはご存知でしょうか?
>>SQLが間違っているとか、クエリ結果の配列から値を取り出そうとしてない値を取り出そうとしてたりとかしないでしょうか?
>
> System.ApplicationExceptionは.NET Frameworkのクラスライブラリでスローされることのない例外ですので、
> 独自にそのプログラムで例外を挙げられていると考えられます。
>
> #.NET Framework1.x時代には、System.ApplicationExceptionクラスは個々のアプリケーションが
> #独自に定義する例外の継承元として推奨されていたクラスです。今となっては使い物にならなくなった
> #クラスのため、このクラスの使用は推奨されていません。
>

よねKENさん 
ありがとうございます。
勉強になります。
引用返信 編集キー/
■52794 / inTopicNo.6)  Re[4]: クリックを押すとエラーが出ます
□投稿者/ たいき (2回)-(2010/08/24(Tue) 16:34:55)
No52790 (マサヤ さん) に返信
情報不足過ぎて申し訳ないです。
SQL文や値をもう一度調べてみます。


No52789 (よねKEN さん) に返信
返信ありがとうございます。
今現在、去年誰かが作られたプログラムを引き継いでやっているところです。
プログラム自体は一応完成しているとは聞いているのですが上記のようなエラーが出て悩んでいるところです。
VB.NET2008で運用出来るようにしたいのですが、その出来あがっていたシステムを開こうとすると変換ウィザードが出てそれもうまくいってないような気がします。
UInteger型は調べましたが使っていないようです。
ReportListは印刷機能なので最悪一から作り直せばいいと思っています。


USERINFOなのですが、継承元の基底クラスにUSERINFOがないんです。
USERINFOは
Me.USERINFO.DataMember = "USERINFO"
のようにデータグリッドのところで使われているのですが…

とりあえずスタックトレースに3箇所ほど不具合が出ているところがあるのでそこを調べてみます。

以前一度確認したのですが、なんとなくわかってきたような気がします。
ありがとうございます。


引用返信 編集キー/
■52798 / inTopicNo.7)  Re[5]: クリックを押すとエラーが出ます
□投稿者/ よねKEN (579回)-(2010/08/24(Tue) 17:46:25)
よねKEN さんの Web サイト
No52794 (たいき さん) に返信
> 今現在、去年誰かが作られたプログラムを引き継いでやっているところです。

ドキュメントはあるのでしょうか?
仕様書、テスト実施の記録などがあるなら、今回の問題に関係しそうなところを確認して、
そのアプリの前提条件(実行環境や用意されているべきデータ等の動作する上での前提となるもの)
をあらかじめ確認しておきましょう。

> プログラム自体は一応完成しているとは聞いているのですが上記のようなエラーが出て悩んでいるところです。

そういうときはまず修正を一切加えてない、本来あるべき環境で動作検証を行って確認した方がよいです。
何かを変えた状態で検証をすると元々の問題なのか、変えたことによる問題なのかの切り分けが困難になります。

> VB.NET2008で運用出来るようにしたいのですが、その出来あがっていたシステムを開こうとすると変換ウィザードが出てそれもうまくいってないような気がします。

気がする、ではなく根拠を持って挑むためにも、上記の現況確認が重要ではないかと思います。
この話からすると元の開発環境はVB2005以前ということですよね。
(2005だったらよいですが、2003以前だと2008との差はそこそこ大きいので
.NET FrameworkとVB.netの歴史を踏まえて置かないと嵌るかもしれません)

> UInteger型は調べましたが使っていないようです。

こちらは一例ですので、まぁこれに該当するとは限りません。
下記が当該エラーに対する説明の掲載されているURLになります。

'<classname>' は、CLS に準拠していない '<baseclassname>' から派生しているため、CLS に準拠していません。
http://msdn.microsoft.com/ja-jp/library/dy4zaya3(v=VS.90).aspx

この説明を読む限りでは、派生元のクラスがCLS準拠を謳っていないのに、
派生クラスで<CLSCompliant(True)>を付加してしまっている、という状況にも思えます。
#CLSって何?という方が、「<CLSCompliant(True)>」を付加する、とは思えないですが・・・。

> USERINFOなのですが、継承元の基底クラスにUSERINFOがないんです。

どのように確認されましたか?
オブジェクトブラウザでの確認をお勧めします。

> USERINFOは
> Me.USERINFO.DataMember = "USERINFO"
> のようにデータグリッドのところで使われているのですが…

これは派生クラス側のことをおっしゃっていますか??それとも基底クラス?

こちらの件についてのエラーメッセージはたいきさんのおっしゃる内容ではMSDNライブラリで見つけられませんでした。
最も近いと思われるメッセージの説明が掲載されているURLも提示しておきます。

<type1> '<membername>' は、ベース <type3> '<classname>' の <type2> '<membername>' と競合しているため 'Shadows' と宣言することはできません。
http://msdn.microsoft.com/ja-jp/library/exy1edzy(VS.90).aspx

> とりあえずスタックトレースに3箇所ほど不具合が出ているところがあるのでそこを調べてみます。

お話に挙がったエラーは、コンパイルエラーなので実行させられない状態ですよね?
どうやって実行させたのでしょう?正しくコンパイルエラーを解決できていないなら、
そのスタックトレースを追うのは徒労に終わる可能性もありますよ。

#コンパイルエラーが起きているということは、たとえばそこをコメントアウトするなどして
#強引に実行すれば、芋づる式に新たな問題が発生することはよくあることです。

引用返信 編集キー/
■52799 / inTopicNo.8)  Re[5]: クリックを押すとエラーが出ます
□投稿者/ todo (41回)-(2010/08/24(Tue) 17:47:15)
> VB.NET2008で運用出来るようにしたいのですが、その出来あがっていたシステムを開こうとすると変換ウィザードが出てそれもうまくいってないような気がします。

元のVisual Studioのバージョンは、何だったでしょうか?
slnファイルをメモ帳で開くと分かります。
まずは、元のVisual Studioのバージョンで動作確認したほうがよいと思います。

引用返信 編集キー/
■52816 / inTopicNo.9)  Re[6]: クリックを押すとエラーが出ます
□投稿者/ たいき (3回)-(2010/08/24(Tue) 20:10:38)
No52798 (よねKEN さん) に返信
元にslnファイルがなく、あるのはログインや検索等の作られたプログラムだけです。
先ほどVB2005でslnファイルを作ろうとしたところ、変換ウィザードがまた出てしまいました。
それ以前のVBで作られたものなのでしょうか?ですがこのプログラムを作ったのは去年だと聞いていて2005以前で作られたとは考えにくいです。

今回のエラーはVB2008でいくつかのアプリを一度まとめてslnファイルを作ってコンパイルし、ログイン画面から各画面へと移動し、
各画面で検索などDBと接続する箇所でエラーが発生しています。
コンパイル自体は出来てしまい、上記にある警告が2つだけでます。

ちょっと以前プログラムを作成した人が使っていたVSSを調べたところ、C#で作ったものもありました。
もしかしたらそちらが完成しているものなのかもしれないので明日見ていこうと思います。

研修終わって1現場経験しただけなので言葉知識足らずで申し訳ないです。
引用返信 編集キー/
■52818 / inTopicNo.10)  Re[7]: クリックを押すとエラーが出ます
□投稿者/ ごう (163回)-(2010/08/24(Tue) 20:36:55)
2010/08/24(Tue) 20:40:33 編集(投稿者)

No52816 (たいき さん) に返信

> 先ほどVB2005でslnファイルを作ろうとしたところ、変換ウィザードがまた出てしまいました。

横から出てきてスミマセンが、「slnファイルをメモ帳で開く」のは、
アクセサリ→メモ帳でメモ帳を開いてから、そこにslnファイルをドラッグ&ドロップすれば開けますよ。

たとえば、Visual Studio 2008で作られたものであれば以下のように書かれています。


Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008


>元にslnファイルがなく、あるのはログインや検索等の作られたプログラムだけです。

えーと、プロジェクト名.projファイルもない状態なんでしょうか?
引用返信 編集キー/
■52820 / inTopicNo.11)  Re[7]: クリックを押すとエラーが出ます
□投稿者/ よねKEN (581回)-(2010/08/24(Tue) 21:18:08)
No52816 (たいき さん) に返信
> ■No52798 (よねKEN さん) に返信
> 元にslnファイルがなく、あるのはログインや検索等の作られたプログラムだけです。

「プログラムだけ」の意味の確認ですが、拡張子がexeやdllのいファイルだけ、という意味でしょうか?
それとも拡張子がvb、resx等のソースファイル一式だけで、slnファイル”だけ”が不足している、ということでしょうか?
元々のslnファイルがなくても、vbprojファイル(プロジェクトに属するソース一式を取りまとめているファイル)があるならまだ大丈夫ですが、
vbprojファイルがないと必須のファイルが不足している状態、ということになります。
(slnファイルも通常はソースファイル一式の1ファイルなので、これがないならソースファイルに不足がある、ということになります)

ちなみに開発言語がc#の場合のプロジェクトファイルの拡張子はcsprojです。

> それ以前のVBで作られたものなのでしょうか?ですがこのプログラムを作ったのは去年だと聞いていて2005以前で作られたとは考えにくいです。

私が先ほど書いた
> この話からすると元の開発環境はVB2005以前ということですよね。
> (2005だったらよいですが、2003以前だと2008との差はそこそこ大きいので
という説明はVB2008ではなく、それより前に発売されたVB.net2002やVB.net2003、VB2005などの製品を使って開発されたのでは?
という意味です。最近開発されたものでも、一世代、二世代前の開発環境で作られている、というようなことは割とよくあります。

slnファイルやvbprojファイルがあればどのバージョンで作られたかはわかります。
また、それらがない場合でも、ソースファイル(vbファイル)を見るとそこで使われている文法から類推できる場合もあります。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -