私の同僚が少し前に非常に疑わしいコードを書き、最終的にそれが壊れてしまいました。簡単なサンプルを次に示します。
Assembly assembly = typeof(SmtpClient).Assembly;
Type _mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); //getting a reference to internal class
//create an instance of System.Net.Mail.MailWriter storing it into _mailWriter variable
//It's internal, but for now it still works
MethodInfo _sendMethod = typeof(MailMessage).GetMethod("Send",BindingFlags.Instance | BindingFlags.NonPublic);
//calling non-public method resulting in app crash
_sendMethod.Invoke(
message,
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new object[] { _mailWriter, true },
null);
MailMessage.Send
いくつかの調査の後、私の開発マシンには実際にメソッドの2つのパラメーターがあることが判明しました。
System.Net.Mime.BaseWriter writer
Boolean sendEnvelope
ただし、QA エンジニアは最近 VisualStudio 2012 をインストールし、.NET 4.5 をインストールしました。そのため、QA 担当者がアプリケーションを実行しようとすると、System.Reflection.TargetParameterCountException
. そして、MailMessage.Send
.NET 4.5 で 3 番目のパラメーターを取得したようです。
System.Net.Mime.BaseWriter writer
Boolean sendEnvelope
Boolean allowUnicode
もちろん、このコードを再実装して、非パブリック インターフェイスの使用を停止する必要があります。ただし、プロジェクトのスケジュールがタイトなため、今は余裕がありません。
ここで質問があります。リフレクションを介してアセンブリの古いバージョン (.NET 4.0 など) を参照する方法はありますか?