問題タブ [internalsvisibleto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - InternalsVisibleTo 属性が機能していません
InternalsVisibleTo
アセンブリ属性を使用して、.NET クラス ライブラリの内部クラスを単体テスト プロジェクトに表示しようとしています。何らかの理由で、次のようなエラー メッセージが表示され続けます。
'MyClassName' は、保護レベルが原因でアクセスできません
両方のアセンブリが署名されており、属性宣言に正しいキーがリストされています。何か案は?
.net - 「フレンド」の使用-単体テストの宣言。悪いアイデア?
[もちろん、質問は特定の「友達」の実装に限定されません。関連する場合は、実装の詳細を自由に指摘してください]
未回答の質問を読んで、私はInternalsVisibleTo
属性に出くわしました:
現在のアセンブリ内でのみ通常表示されるタイプが別のアセンブリに表示されることを指定します。
MSDNのC#プログラミングガイドには、属性を使用して別のアセンブリでメソッドと型を使用できるようにする方法を説明する[フレンドアセンブリ]セクションがあります。internal
これを使用して、単体テストアセンブリで使用するライブラリをインストルメント化するための「非表示」インターフェイスを作成するのは良い考えではないかと思います。両方向(本番アセンブリでのテストコード、テストコードでの本番アセンブリに関する詳細な内部知識)での結合が大幅に増加するようですが、一方で、パブリックインターフェイスを乱雑にすることなくきめ細かいテストを作成するのに役立つ場合があります。
テスト時に友達宣言を使用した経験は何ですか?それはあなたの銀の弾丸でしたか、それとも死の行進を始めましたか?
.net - InternalsVisibleToはマネージC++では機能しません
InternalsVisibleToは、マネージC ++プロジェクトでは機能しませんが、C#プロジェクトでは機能します。どんな助けでもいただければ幸いです。これが簡略化されたレイアウトです。
プロジェクトA -C#には、 B/Cからアクセスしたい内部プロパティがあります。
プロジェクトB-マネージC++。参照A。 _
プロジェクトC -C#、参照 A。
すべてのプロジェクトは同じキーで署名されています。ILDASMまたはReflectorを使用してコンパイルされたアセンブリを見ると、それらがすべて正しく署名されていることがわかります(内部プロパティの使用法をコメントアウトした場合)。
プロジェクトAのAssemblyInfo.csには、次のInternalsVisibleToがあります。
キーはカットアンドペーストされているので、正しいことがわかります。
コンパイルしようとすると、AとCは正常にコンパイルされますが、プロジェクトBは次のように失敗します。
MSDNのドキュメントによると、これはC++で機能します。バグや他にやらなければならないことがありますか?
私が署名したアセンブリでのみ使用できるようにプロパティを保護する別の方法はありますか?すべてのアセンブリを保護できることはわかっていますが、このようにきめ細かいレベルで保護できますか?
編集
MSDNのコメントに基づいて、属性を次のように変更しましたが、それでも機能しません。
.net - XmlSerializer および InternalsVisibleTo 属性
属性XmlSerializer
を使用して内部クラス メンバーをシリアル化することは可能ですか?InternalsVisibleTo
そうである場合、どのアセンブリに内部を表示させる必要がありますか。つまり、どのアセンブリ名と公開キーをInternalsVisibleTo
属性に提供する必要があるかということです。
rhino-mocks - RhinoMocksで内部クラスをモックする
そのため、RhinoMocksでモックしようとしている内部クラスがたくさんあります。次の行をassemblyinfo.csに追加しました。
ただし、これでも内部クラスをモックすることはできません。NUnitから次のエラーメッセージが表示されます。
MyTests.SomeTest:System.TypeLoadException:メソッド'SomeMethod' on type'SomeType504cf40be6b444abfd417dccf5d6752' from assembly'DynamicProxyGenAssembly2、Version = 0.0.0.0、Culture = neutral、PublicKeyToken = null'は、そのアセンブリからは見えないメソッドをオーバーライドしています。
「Castleアセンブリを使用したダウンロードオプション」ではなく、「マージされた」バージョンのRhinoMocksを使用していることに注意してください。CastleがどのようにRhinoMocksにマージされたかはわかりませんが、内部をRhinoMocksに表示するべきではなく、同様にCastle(Rhino.Mocks.dllの一部)に表示する必要がありますか?
.net - プライベート メソッドをテストするための非コード生成転送シム
一般に、私はテスト目的でプライベートへのアクセスを必要としないような方法でクラスを設計します。アンInternalsVisibleTo
もお手伝いします。
ただし、現在、[VSTS のプライベート アクセサー メカニズム]( http://msdn.microsoft.com/en-us/library/ms184807(VS.80 .aspx) (つまり、リフレクションを使用してクラスのメンバー (およびオプションでメンバーも)を呼び出す転送を持つクラスをVSCodeGenAccessors
生成するために使用します。*_Accessor
private
internal
だから私は次のようなコードを持っています:
(はい、アンチパターンだらけですが、メッセンジャーを撃たないでください)
これにはいくつかの問題があります。
- 必要なプライベートを明確にしたい
- ダイアログを呼び出したくない (はい、私は CRaholic です)
- 写真にコード生成を含めたくない
したがって、上記のコードを次のように変換できるようにしたいと思います。
私のテストアセンブリには次のインターフェイスのみがあり、生成されたコードやカスタムビルドステップはありません:-
そこから、CodeRush または Ctrl KM を使用して、キーストロークのみでインターフェイスに新しいシャドウ メソッドを生成できます。
I Shadow.Create<I>( Object o)
1. インターフェースを実装する動的プロキシを生成する 1. ラップされるオブジェクトが、インターフェースによって指定されたすべてのメンバーを持っていることを確認する1. bnous o
: フィールドを表すプロパティの転送を管理する (つまり、 、`_privateMethodWasCalled' ケース) 正しく
それで、誰かがこのようなものを実装するライブラリを知っていますか(またはそれを書くのに十分退屈ですか?)
明らかな欠点の 1 つは、実行時までインターフェイスが ClassUnderTest と互換性がないかどうかわからないことですが、これはテスト専用であるため問題ありません。また、プライベート アクセサー メカニズムである AIUI も、時々同期するために再コンパイルをトリガーする必要があります。
または、私が見逃しているより良い方法がありますか? (すべてのプライベートを内部またはパブリックに一括アップグレードしたくないこと、および作業コードを書き直す必要がないことを思い出してください)
xUnit.net、.NET 3.5 を使用。任意の動的プロキシ ライブラリまたはその他の使用にオープン
.net - SGEN、InternalsVisibleTo、およびアセンブリ署名
ちょっと変わったことをしようと...
私はこのクラス Foo を持っています:
Name の内部セッターと、内部のデフォルト コンストラクターに注意してください。これにより、通常は XML シリアライゼーションが妨げられますが、XML シリアライゼーション アセンブリを InternalsVisibleTo の「フレンド」としてマークしました。
そして、シリアル化アセンブリを事前生成する MSBuild タスクを追加しました。
これは正常に機能します。Name プロパティは正しくシリアル化および逆シリアル化されます。
アセンブリに署名したいので、アセンブリのキー ファイルを定義し、キーに一致するように InternalsVisibleTo 宣言を変更します。
しかし、今 SGEN は失敗します:
一時クラスを生成できません (結果 = 1)。
プロパティまたはインデクサー 'TestXML2008.Foo.Name' を割り当てることができません -- 読み取り専用です
SGEN タスクはマクロを介してキー ファイルを選択する必要がありますが、明らかにそれだけでは十分ではありません... また、SGEN タスクでキー ファイルを明示的に指定しようとしましたが、成功しませんでした。コマンドラインで sgen.exe を使用すると、同じ結果が得られます...
何か不足していますか?アセンブリに署名すると機能しない理由がわかりません...
c# - InternalsVisibleTo により CS0246 エラーが発生します: タイプまたは名前空間が見つかりませんでした
追加することにより、あるアセンブリが別のアセンブリの内部クラスにアクセスできるようにしようとしています
二次会へ。ただし、これにより次のエラーが発生します。
ここの例に従っています: MSDN リファレンス
私は何を間違っていますか?
c# - assembly:InternalsVisibleTo 属性の「AllInternalsVisible」パラメータとは何ですか?
私の IntelliSense は、ブール値の名前付きパラメーター "AllInternalsVisible=" を[assembly:InternalsVisibleTo("AssemblyName")]
宣言で作成しています。2 番目の二重引用符の後にカーソルを置き、Ctrl-スペースを押します。それは何ですか-MSDNでそれに関するドキュメントが見つかりません。VS2005 と .Net 2.0 を使用しています。
関連するトピックとして、私はフレンド アセンブリについていくつかの調査を行っていますが、フレンド アセンブリに内部へのアクセスを許可すると、フレンド アセンブリはすべての内部にアクセスできるようになり、それについて詳細を把握することはできないと考えました。それは本当ですか、またはすべてではなく一部の内部型/メンバーへのアクセスをフレンド アセンブリに許可する方法 (上で提案したように) はありますか?
.net - 4.0 ベータ 2 アセンブリの完全な公開キーを取得できません
一部の .net 4.0 beta 2 アセンブリの公開キーを取得する際に問題が発生しているため、内部をそれらに表示できます (グロス)。
通常、私は SN.EXE に飛び込んで、それらを取得します。
しかし、通常期待するものを取得する代わりに、偽の公開鍵を取得しています。正確な理由はわかりません。
SN の 64 ビット版を使用しています
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64>sn.exe
私が対象としている dll の 64 ビット バージョンに対して使用しています。
C:\Windows\Microsoft.NET\Framework64\v4.0.21006\system.xaml.dll
そして、私はこれを出力として取得しています:
公開鍵は00000000000000000400000000000000
公開鍵トークンは b77a5c561934e089 です
トークンは正しいですが、公開鍵は BS です。何が起きてる??