代码之家  ›  专栏  ›  技术社区  ›  Mark Harrington

C 3.5 WinForms应用程序升级到C 4.0版本,因为不包括CA

  •  3
  • Mark Harrington  · 技术社区  · 14 年前

    我有一个C 4.0 WinForm应用程序,我刚从3.5升级到4.0。C 4.0 WinForms应用程序引用C 3.5 dll,该dll将根据用户选择从网络路径加载一系列dll,然后使用System.Reflection创建/调用dll。当应用程序设置为使用3.5作为目标框架时,一切工作都很好。升级后出现此错误:

    试图从网络位置加载程序集,这将导致在早期版本的.NET Framework中对程序集进行沙盒处理。默认情况下,此.NET框架版本不启用CAS策略,因此此加载可能很危险。如果此加载不打算对程序集进行沙盒处理,请启用LoadFromRemoteSources开关。见 http://go.microsoft.com/fwlink/?LinkId=155569 更多信息。

    当我尝试从网络路径加载程序集时会发生这种情况:

    var assembly = Assembly.LoadFile(path);
    

    在做一些研究时,我发现CAS在4.0版本中被“某种程度上”消除了。我被建议在app.config中输入以下条目:

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

    现在,我得到的例外是:

    调用的目标引发了异常。在System.RuntimeTypeHandle.CreateInstance上(RuntimeType类型、Boolean PublicOnly、Boolean NoCheck、Boolean&CanBecached、RuntimeMethodHandleInternal&ctor、Boolean&BneedSecurityCheck) 在System.RuntimeType.CreateInstanceSlow(Boolean PublicOnly、Boolean SkipCheckThis、Boolean FillCache) 在System.RuntimeType.CreateInstanceDefaultctor(Boolean PublicOnly、Boolean SkipVisibilityChecks、Boolean SkipCheckThis、Boolean FillCache) 在System.Activator.CreateInstance(类型类型,布尔非公共) 位于System.RuntimeType.CreateInstanceImpl(bindingFlags bindingAttr、binder binder、object[]args、cultureInfo culture、object[]activationattributes) 在System.Activator.CreateInstance上(类型、bindingFlags bindingAttr、binder binder、object[]args、cultureInfo culture、object[]activationattributes) 位于System.Reflection.Assembly.CreateInstance(字符串类型名、布尔型IgnoreCase、bindingFlags bindingAttr、binder binder、object[]args、cultureInfo culture、object[]activationattributes) 位于system.reflection.assembly.createInstance(字符串类型名) at architecture.data.transformations.assemblyhelperbase.createInstanceExplicit[T](程序集,字符串类型名) 在architecture.data.transforms.mappingtransform.processmap(字符串映射、字符串路径、IxPathNavigable文档)上 在architecture.data.transforms.mappingtransform.execute(字符串映射、字符串路径、xmlDocument transformedxml) 在architecture.data.transforms.mappingtransform.execute(xmldocument transformedxml,int32 historyid) 在architecture.data.transformations.transformationsdataservice.transformxmlmap(xmlcontext transformedxml,int32 historyid)上 at architecture.data.transformationsdataservice.createpcsxml(历史记录历史记录) at architecture.data.transformations.transformationsdataservice.reshred(int32 historyID)

    内部异常是:该程序集不允许部分受信任的调用程序。

    此异常在我从网络位置加载程序集后引发,但我正尝试使用激活器在程序集中创建类型的实例。

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

    C 4.0 WinForms应用程序已签名(.snk文件)。 将安全设置作为完全信任应用程序检查后,单击。 我尝试了更改app.config设置和项目设置的组合,甚至删除了签名。为了让Winforms的应用程序保持4.0而不是3.5,我在这里绞尽脑汁想办法解决这个问题。有人能帮忙吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Hans Passant    14 年前

    你的 <loadFromRemoteSources> 元素无效。在MSDN文档中明确指出:

    此元素的已启用属性 只有在代码访问时才有效 安全性(CA)被禁用。

    您启用了CA。运行caspol.exe为网络位置分配信任。说明 are here .