7

タイトルと同じくらい簡単です。ソリューションを .Net 2-3.5 から .Net 4 にアップグレードしました。問題なく動作し、VS 2012 をインストールして .Net 4.5 をインストールしました。次のコードを使用して動的に生成された DLL:

Assembly assembly = Assembly.LoadWithPartialName("DavesNamespace.Custom");
var attributes = assembly.GetCustomAttributes(typeof(ChecksumAttribute), true);

GetCustomAttributes に指定された Type の有無にかかわらず例外が発生しますが、その時点でのみ例外がスローされ、アセンブリが正常に読み込まれ、ブレーク ポイントを挿入すると CustomAttributes コレクションを実際に表示できます。

vs2012 をインストールして以来、元の .Net 2-3.5 バージョンは引き続き機能します。

オンラインで見ると、vs2012 に起因する ExecutionEngineExceptions で終わるいくつかの問題が見つかりましたが、答えはありません。この問題は VS2012 と .Net 4.5 を削除することで解決できますが、VS2013 がリリースされたときに会社全体で VS2013 に移行する予定であるため、これは実際の解決策ではありません。

編集:これを行うサンプルアプリでエラーが発生し、アプリケーションが4.5をターゲットにして構築されていても例外がスローされます

以下のコメントに追加されたスタック トレース (null です)

4

1 に答える 1

1

特定の状況の問題を解決しましたが、ルートは、.Net 4.5 が DLL の CustomAttributes を読み取る方法の文書化されていない変更であると思います。

解決策は、設定されているCustomAttributeBuilderAssemblyBuilder.Save()を[アセンブリのすべてのコンテンツが入力された後] の前の最後のものから最初のthing after AppDomain.CurrentDomain.DefineDynamicAssembly()[コンテンツが入力される前] に移動することでした。

例外がスローされた実際のコードを変更する必要はありませんが、代わりに使用するようにリファクタリングしましLoadWithPartialName()たが、Load(),この回避策はまだ機能してLoadWithPartialName()います。

アセンブリのコンテンツの後にカスタム属性を追加すると、カスタム属性が間違った場所に配置される可能性がありますか? しかし、この問題は MS に記録されており、調査が行われています。

于 2013-07-30T07:57:58.900 に答える