アクセスできない保護レベルってどういうことでしょうか

タグの編集
投稿者 英人  (社会人) 投稿日時 2021/7/30 11:09:14
お世話になります。
VS2019に挑戦中です。
以下のデバッグ中で testの内容を見ると
「アクセスできない保護レベルとなっています」となり ウォッチできません。

 Public Sub 仕様Load(ByVal FileName As String)
        Dim test As String = FileName
・・・
これはどういう状態なのでしょうか?
ちなみに、FileNameの内容を調べようとして、、
「アクセスできない保護レベルとなっています。最適化されているかもしれません」
(だったかな?)
という表示でウォッチできなかったので、
「オプション」「ウィンドウズフォームデザイナー」「全般」「最適化されたコード生成」のチェックを外したら、ウォッチできるようになりました。
しかし、Testだけは依然としてウォッチできないのです。

VS2005だと普通に見られたのですが・・。
投稿者 るきお  (社会人) 投稿日時 2021/7/30 20:12:27
VS2019で次のプログラムで試してEnd Subのところでブレークして確認したところ、FileNameもtestもウォッチウィンドウで値を確認できました。
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        仕様Load("ABC")

    End Sub

    Public Sub 仕様Load(ByVal FileName As String)
        Dim test As String = FileName
    End Sub
End Class


現象が再現できる手順がわかれば教えてください。
投稿者 英人  (社会人) 投稿日時 2021/8/2 09:16:56
るきお様、ありがとうございます。
>現象が再現できる手順がわかれば教えてください。 
といただきましたが、プログラムの中身が問題なのではないと考えています。
開発環境の設定(オプションを含めて)の問題だと思います。

先に確認させてください。
るきお様に教えていただいた、プロジェクトの参照ですが、
ソリューションエクスプローラーで、プロジェクトを右クリックして開く、プロパティで参照の変更をしようとしたところ(参照設定)、vbprojの拡張子が選択できなかったので、DEbug内のdllの参照にしました。
これで良いのでしょうか。

参考にしただけたらと思い、私のやったことを以下に述べます。
1.VS2005で作成したプロジェクトを含むディレクトリを新しいPCの"C:\Users\・・・\Documents\Visual Studio 2019\作成プログラムソース"というフォルダーを作りそれ以下にコピーしました。
2.コピーしたソースのsln拡張子のファイルをダブルクリックしてVS2019を起動し、自動のアップデートを行いました。
3.参照設定で行方不明となったdllの位置を修正し、ビルドしました。
ビルドは正常に終了しました。

4.デバッグしようとしましたが、「アプリケーションはブレークモードになっています」という表示と、
「お使いのアプリはブレーク状態になりましたが、すべてのスレッドが外部コード (通常はシステム コードまたはフレームワーク コード) を実行していたため、表示されるコードはありません」
5.どうやら 「オプション」の「デバック」「全般」にある「マイコードのみを有効にする」にチェックが入っていると、複数のプロジェクト間のデバックができない?ようです。
チェックを外したら、ブレークポイントがヒットしました。
6.「オプション」の項目を見ると
「オプション」「デバッグ」「シンボル」という項目が見えたので、
「このディレクトリにシンボルをキャッシュ」というところに、試しに、
C:\Program Files (x86)\Microsoft Visual Studio\2019
を入力して見たところ、現状ブレークポイントもヒットしています。
7.こちらの「入門講座」の第7回ビルド、2.ビルドで「既定ではビルドするための設定が2つ用意されています。1つは開発用の設定で、Debug(デバッグ)と呼びます・・・」とありましたが、
私の場合、「Release」と初期になっていましたのでこれを「Debug」に変えました。
すると、デバッグ実行時にシンボルを読み込んでいますというような表示がでてきました。

以上が現在の状況ですが、「アクセスできない保護レベル」の表示が「最適化」とともに現れたり、単独で現れたりの状況です。
ちなみに参照しているdllは私が作ったもので、ソースをコピーしてビルドしたもの(12個程あります)です。「アクセスできない」がどういう意味で、どう扱えば良いのかが理解したいです。
投稿者 るきお  (社会人) 投稿日時 2021/8/2 14:52:06

>プロジェクトの参照ですが、
>ソリューションエクスプローラーで、プロジェクトを右クリックして開く、プロパティで参照の変更をしようとしたところ(参照設定)、vbprojの拡張子が選択できなかったので、DEbug内のdllの参照にしました。
これで良いのでしょうか。

いいえ。
プロジェクトに参照設定するには、ソリューションエクスプローラーで(主となる方の)プロジェクトを右クリックして、[追加] - [プロジェクト参照] から対象のプロジェクトを選択してください。

この記事にも方法を記載しています。
https://www.umayadia.com/VBStandard2/Standard31.htm#A4_4

設定はデフォルトのままでウォッチもできますし、ブレークポイントによるステップ実行もできます。変更した設定は元に戻すことをお勧めします。
Visual Studioの[ツール]メニューの[設定のインポートとエクスポート]で、「すべての設定をリセット」できます。

デバッグ時にソリューション構成を Release ではなく、Debugにするのはよい選択です。

>「アクセスできない」がどういう意味で、どう扱えば良いのかが理解したいです。
文字通りアクセスできないのだと思いますが、英人さんにとっては目の前にあってアクセスできそうに見えるものになぜアクセスできないのかという疑問がおありだと思います。
通常はこのようなことは発生しないので、なぜアクセスできないのかの回答は英人さんが通常と違う何をしているかにヒントがありそうです。英人さんの説明を見た範囲では私には直接の回答はできませんが、まずは通常通り、プロジェクト参照をしていただいてどうなるか様子を見てみるのが正攻法と思います。
この他に、通常と違う何をされているのかは具体的な再現手順をもとに考えなければわかりません。再現手順がわかったとしてもわからない可能性はあります。

そこで、私からの提案はここのコメントに書いた通りです。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30627#CommentId84608
投稿者 英人  (社会人) 投稿日時 2021/8/3 08:58:59
お世話になります。
>プロジェクトに参照設定するには、ソリューションエクスプローラーで(主となる方の)プロジェクトを右クリックして、[追加] - [プロジェクト参照] から対象のプロジェクトを選択してください。
といただきましたが、「サービス参照」というのがありましたが、プロジェクト参照が見つかりません。
今まで参照していたDLLは解除しております。

>設定はデフォルトのままでウォッチもできますし、ブレークポイントによるステップ実行もできます。変更した設定は元に戻すことをお勧めします。
Visual Studioの[ツール]メニューの[設定のインポートとエクスポート]で、「すべての設定をリセット」できます。
やってみました。
投稿者 英人  (社会人) 投稿日時 2021/8/3 11:43:50
お世話になります。
ソリューションエクスプローラーでプロジェクトを右クリック。
「追加」「参照」で「参照マネージャー」が開きました。
「プロジェクト」からプロジェクトの追加ができました。
事前に、ソリューションエクスプローラーで、
「追加」「既存のプロジェクト」でプロジェクトのソリューションへの追加?が必要でした。

また、ソリューションエクスプローラーでプロジェクトを右クリック。
「プロパティ」「参照設定」を見ると、「Debug」フォルダー内のdllを参照しておりました。
(自動で設定されているようです)

オプション等、変更したものは初期化しています。

この状態で、「Debug」にして「開始」しますと、
「・・・は宣言されていません。アクセスできない保護レベルになっています。」のエラーが一杯でてしまいました。

また、「重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
警告 この参照を解決できませんでした。アセンブリ "・・・" が見つかりませんでした。アセンブリが間違いなくディスクに存在することを確認してください。 コードにこの参照が必要な場合、コンパイル エラーが発生する可能性があります。」
となります。
どうすれば良いでしょうか?
投稿者 るきお  (社会人) 投稿日時 2021/8/3 20:52:43
>ソリューションエクスプローラーでプロジェクトを右クリック。
>「追加」「参照」で「参照マネージャー」が開きました。
>「プロジェクト」からプロジェクトの追加ができました。
.NET Frameworkを使用されているのでしたね。
それであれば、このやり方になります。

>どうすれば良いでしょうか?
再現手順がわかれば私もやってみるのですが、英人さんのソリューションがどのような状態かもわからずアドバイスしにくいです。(プロジェクトがいくつあってどういう参照状態になっているのかもわからないです。)


この状況を前提にすると、私からの提案はここのコメントに書いた通りです。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30627#CommentId84608

とにかく、シンプル化して、切り分けていくことになります。
たとえば、エントリポイントとなっているのはWindowsフォームアプリケーションのプロジェクトですよね?
このプロジェクトだけのソリューションを作成し、他のプロジェクトに依存している部分はすべてコメントにするなどします。
そして、このプロジェクト単体できることをまず確認します。
次に、依存しているプロジェクト(クラスライブラリ?)のうち1つをソリューションに追加し、Windowsフォームのプロジェクトから参照設定します。
追加したプロジェクトはほとんどをコメント化し、1機能だけ(数行レベル)を残します。この1機能をWindowsフォームのプロジェクトから呼び出せることを確認します。
うまくいけば、もう1機能試します。これを地道に繰り返します。
うまくいかなければ、追加したプロジェクトをソリューションからはずして再びWindowsフォームアプリケーションだけのソリューションにします。
そして、新規に空のクラスライブラリを追加し、適当な機能を記述してWindowsフォームアプリケーションから参照設定して呼び出せることを確認します。
うまくいけば、本来呼び出したいクラスライブラリから1機能だけ(数行レベル)をコピーして、この新規クラスライブラリに貼り付けて、うまく呼び出せることを確認します。

このような地道な作業を繰り返しているうちに何か気づきがあることと思います。
投稿者 英人  (社会人) 投稿日時 2021/8/4 14:33:59
ありがとうございます。

泣き言になります。
VS2005からの移植といいましたが、2005年から仕事の合間を縫って16年間かけて作ってきたものです。大半の部分はすでに仕事で使っていましたが、どうしても超えられない壁があり、ようやく移植しようと思える完成度まできました。

参照しているdllも別の参照をもっていたり、その参照先が共通だったりします。その参照のプログラムが10個くらいあります。
全体として、実行ファイルで50MBくらいあるようです。

アドバイスいただいたことはその通りと思いますが、この先何年かかるかと思うと手が出ません。
実際、このプログラムを完成させるまでに WindowsはXPから10になり、CPUは普通に64になってしまいました。もう代替えできるPCはすでに無く、これ以上時間をかけられない状況です。

申し訳ないのですが、プロジェクトの参照をあきらめ、Releaseフォルダーの中のdllの参照にもどしてしまいました。Debugしたいときに、そのdllだけをDebug内のdllに変え、プロジェクトの追加でDebugしてみます。それでうまくいかない場合は、参照先のプロジェクトを単体で変更、コンパイルしてみます。

せっかくアドバイスいただいたのに、沿うことができませんで申し訳ありませんでした。
投稿者 るきお  (学生) 投稿日時 2021/8/4 15:15:03
そのうまく動かないソリューション一式を送ってもらうことは可能ですか?
あまり時間はさけませんが、少し見て何かわかることがあればお伝えすることはできます。