もくじ
目次(WPF/xaml/C#/C++関連メモ) - tera1707’s blog
やりたいこと
.NET6で作ったdllやexeの中のクラスやメソッドをUnitTestするときに、publicなクラスだけではなく、internalなクラスもUnitTestしたい。 で、以前.Net Frameworkでそういうことをしたときに、internalなクラスを外から呼ぶ方法を調べたのでそれをやろうとしたら、.NET6では、プロジェクトを作成したときに「AssenblyInfo.cs」が自動で作成されなくなっていたので、そのまんまの方法ではできなかった。
.NET6でも、同じことがしたい。
やりかた
外から見てほしいinternalなクラスを持っているプロジェクト(アセンブリ)に、自分で「AssenblyInfo.cs」を作成して、そこに[assembly: InternalsVisibleToAttribute("アセンブリ名")]
を書いてやればよい。
やりかたサンプル
internalが外(別アセンブリ)から見れない状態
まずは、internalなクラスを外から見ようとしてみて、見れないことを確認する。
internalなクラスを持つクラス(見られる側/dll)に、こういうクラスを作って、
namespace ClassLibrary1 { internal class InterlalClass { public int MyMethod() => 123; } }
internalなクラスを呼びたいexe(見る側/exe)をこういうコードにすると、
var ic = new ClassLibrary1.InterlalClass();
Console.WriteLine(ic.MyMethod());
怒られる。
internalが外(別アセンブリ)から見れるようにする
まず、見られたい側のプロジェクトに、"AssemblyInfo.cs"というファイルを作成する。
その中身を全部削除して、下記のようにする。
("MainConsoleApp"は、見る側のアセンブリ名。このアセンブリからだけは、internalでも見えるようにしますよ、という感じ)
using System.Runtime.CompilerServices; [assembly: InternalsVisibleToAttribute("MainConsoleApp")]
そうすると、呼ぶ側でも見えるようになる。
備考
今回、
[assembly: InternalsVisibleToAttribute("MainConsoleApp")]
を"AssemblyInfo.cs"を作ってそこに書いたが、
"AssemblyInfo.cs"を作らなくても、呼ばれたいアセンブリ(今回でいうとClassLibrary1
プロジェクト)の中のほかのどこかに書けばOK。
(例えば、MyClass1.cs
の一番上とか。)
また、「署名したアセンブリ」に対しては、ちょっと違う書き方をしないといけないっぽい。
今回は試してないので、MS公式を参照。
参考
MS公式。
参考にさせて頂いたサイト