3

3.5 から 4.0 にアップグレードしたばかりの C# 4.0 Winform アプリがあります。C# 4.0 Winforms アプリは、ユーザーの選択に基づいてネットワーク パスから一連の dll をロードし、System.Reflection を使用して dll を作成/呼び出す C# 3.5 dll を参照します。アプリケーションがターゲット フレームワークとして 3.5 を使用するように設定されている場合、すべてが正常に機能しました。アップグレード後にこのエラーが発生しました:

以前のバージョンの .NET Framework では、アセンブリがサンドボックス化される原因となったネットワーク上の場所からアセンブリを読み込もうとしました。このリリースの .NET Framework では既定で CAS ポリシーが有効になっていないため、この負荷は危険な場合があります。この読み込みがアセンブリをサンドボックス化することを意図していない場合は、loadFromRemoteSources スイッチを有効にしてください。詳細については、http: //go.microsoft.com/fwlink/?LinkId=155569を参照してください。

これは、ネットワーク パスからアセンブリを読み込もうとしているときに発生します。

var assembly = Assembly.LoadFile(path);

いくつかの調査を行ったところ、4.0 リリースでは CAS が「一種」削除されていることがわかりました。app.config に次のエントリを入れるようにアドバイスされました。

<runtime>
    <loadFromRemoteSources enabled="true"/>
    <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

今、私が得ている例外は次のとおりです。

呼び出しのターゲットによって例外がスローされました。System.RuntimeTypeHandle.CreateInstance (RuntimeType 型、ブール型 publicOnly、ブール型 noCheck、ブール型 & canBeCached、RuntimeMethodHandleInternal & ctor、ブール型 & bNeedSecurityCheck) で System.RuntimeType.CreateInstanceSlow (ブール型 publicOnly、ブール型 skipCheckThis、ブール型 fillCache) で System.RuntimeType.CreateInstanceDefaultCtor (ブール型 publicOnly) 、Boolean skipVisibilityChecks、Boolean skipCheckThis、Boolean fillCache) で System.Activator.CreateInstance(Type type, Boolean nonPublic) で System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr、Binder バインダー、Object[] args、CultureInfo culture、Object[]activationAttributes) でSystem.Activator.CreateInstance(Type タイプ、BindingFlags bindingAttr、Binder バインダー、Object[] 引数、CultureInfo カルチャ、

内部例外は次のとおりです。そのアセンブリは、部分的に信頼された呼び出し元を許可しません。

この例外は、ネットワークの場所からアセンブリを読み込んだ後にスローされますが、Activator を使用してアセンブリに型のインスタンスを作成しようとしています。

protected T CreateInstanceExplicit<T>(Assembly assembly, String typeName)
{
    return (T)assembly.CreateInstance(typeName);
}

C#4.0 Winforms アプリは署名されています (.snk ファイル)。セキュリティ設定が完全​​信頼アプリケーションとしてチェックされたらクリックします。app.config 設定とプロジェクト設定の変更を組み合わせて、署名を削除することも試しました。私はここで、Winformsアプリを3.5ではなく4.0のままにするために何ができるかを理解しようとしています。誰でも助けることができますか?

4

1 に答える 1

2

あなたの<loadFromRemoteSources>要素は効果がありません。それについては、MSDN ドキュメントに明示的に記載されています。

この要素の enabled 属性は、コード アクセス セキュリティ (CAS) が無効になっている場合にのみ有効です。

CAS を有効にしました。Caspol.exe を実行して、ネットワークの場所に信頼を割り当てます。手順はこちらです。

于 2010-09-15T20:49:40.857 に答える