0

Visual Studioのリリース構成とデバッグ構成のどちらでコンパイルされたかによって、動作が異なるコードに問題があります。リリース構成に表示されるすべてのプロジェクトコンパイル設定を手動で変更して、デバッグ構成と一致するようにしましたが、問題は解決しません。

以下のコードは、実行中のアセンブリのGUIDを返します。

private static Guid GetApplicationUid() 
{ 
   Assembly assembly = Assembly.GetCallingAssembly(); 
   GuidAttribute attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), false)[0]; 
   return new Guid(attribute.Value); 
}

メソッドは「インデックスが配列の境界外にありました」で失敗します。リリースモードでのコンパイル後に実行された場合の例外。デバッグモードで正しく動作します。この理由は、この構成では、GetExecutingAssembly()によって作成されたアセンブリ参照が、基になる「実際の」アセンブリではなく、一時的なアセンブリ(App_Web_eelfd0ff、Version = 0.0.0.0、Culture = neutral、PublicKeyToken = nullなど)に対するものであるためです。

不思議なことに、同じコードを使用し、コンパイルモードに関係なく同じように動作する、同じWebで実行されている別のコンポーネントがあります。

なぜこれが起こっているのですか、そしてそれを防ぐ方法は?

4

2 に答える 2

1

最適化が有効になっている場合、関数が別のアセンブリにインライン化されている可能性があります。この回答MethodImplOptions.NoInliningに従って、メソッドがアセンブリに含まれるように、を追加してみてください。

于 2013-01-13T09:10:52.267 に答える
0

例外は、アセンブリにGUID属性がないことを意味します。推測では、アセンブリがCOM表示に設定されていない場合は、リリースモードのコンパイラによって最適化される可能性があります1。他の動作中のアセンブリをチェックして、COM相互運用機能に登録されているかどうかを確認してください。

1 GUIDは、COM相互運用用の.NETアセンブリでのみ使用されます。Visual Studioは、COM相互運用を実行する場合に備えて、新しいプロジェクトを作成するときにGUIDを自動的に追加しますが、それ以外の場合は役に立ちません。

于 2013-01-12T19:07:55.030 に答える