.Net Object标记,用于加载其他DLL

时间:2012-10-12 16:49:31

标签: c# .net internet-explorer com object-tag

好的,我有一个项目来创建一个.Net控件,它通过网页上的COM对象与客户端条形码扫描器交互(只需要IE)。为此,我们使用了.Net Windows窗体控件库DLL,它使用Object标签加载:

<object id="scannerCont" classid="http:ControlAssembly.dll#Controls.MyControl"/>

到目前为止,我已经获得了.Net控件在网页中呈现,但现在我遇到了麻烦,因为我无法获得控件来获取对其他DLL的访问权限。基本上,控件调用一个非托管DLL,它提供对扫描仪单元的COM互操作访问。当我加载页面而不尝试访问DLL时,它加载得很好,但当我尝试引用它时,我在临时Internet文件夹中收到FusionBindErrors。

错误如下:

*****   IEHOST Error Log (Friday, 12 October 2012 09:27)    *****



URL:        http://scanner:8014/scanner/ControlAssembly.dll
Zone:       2
Assembly Name:  ControlAssembly.dll
Type Name:  Controls.MyControl



----- Thrown Exception -----


System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileLoadException: Could not load file or assembly 'ActiveScanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)
File name: 'ActiveScanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.Security.Policy.PolicyException: Required permissions cannot be acquired.
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission)
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Int32& securitySpecialFlags, Boolean checkExecutionPermission)
   at Controls.MyControl..ctor()
   --- End of inner exception stack trace ---
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
   at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateComInstanceFrom(String assemblyName, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   at System.AppDomain.CreateComInstanceFrom(String assemblyFile, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   at System.AppDomain.CreateComInstanceFrom(String assemblyFile, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   at Microsoft.IE.SecureFactory.CreateInstanceWithSecurity2(Int32 dwFlags, Int32 dwZone, String wszSite, String wszId, String wszConfig, String wszLicenses, String wszDeploymentManifest)

现在,因为我理解错误是由于权限问题。在你们回应说要将网页添加到可信站点列表之前,这不是一个选项。这是一个面向客户的组件,我们最多只能提交它们以接收安全警告消息,他们可以单击这些消息以允许控件提升权限。

我一直试图找到解决方案,但这似乎并不是一种广泛采用的做法,因此很少有关于如何缓解此错误的文档。

我想要注意的是,如果我从网站文件夹中删除了从我加载控件的无关DLL然后收到File Not Found FusionBindError,这意味着系统应该能够加载这个无关的DLL一次我解决此权限问题...

任何人都有授予此权限的经验吗?同样,我们很好,最终用户从.Net获取弹出窗口,要求他们允许授予此权限,但我们不能要求我们的最终用户将我们的站点添加到受信任区域。

我想知道我是否可以在对象标记中添加一些信息,说它还需要这个其他的DLL?

1 个答案:

答案 0 :(得分:1)

正如您所见,

在IE中托管的.NET控件在具有受限权限的“沙箱”中运行。使用.NET 2.0 / 3.0 / 3.5,调整权限的唯一方法是修改客户端计算机上的代码访问安全性(CAS)策略。我无法从错误消息中了解所需的特定权限,但我猜测ActiveScanner.dll要求“FullTrust”(因为它必须与COM互操作) - 并且Internet Explorer中没有区域可以完全信任默认情况下。

使用.NET 4.0+,沙盒模型已更改(它使用代码中的属性 - SecurityCrtical,SecurityTransparent等);我没有使用.NET 4.0,但我不认为Internet Explorer会向您的控件授予“完全信任”。

总结:我不知道您可以在网页/ object-tag上执行任何操作以请求其他权限。如果不修改客户端PC上的内容,IE就不会授予完全信任权限。