我创建了一个启动应用程序的ActiveX dll程序集。我在浏览器中通过JavaScript调用了这个dll。该应用程序是通过点击URL启动的。
要使此脚本正常工作,我需要转到IE设置并启用“初始化并编写未标记为安全的activex控件脚本”。有没有办法编写ActiveX对象以将其标记为安全?
我使用SN工具生成密钥(.snk文件),使用此密钥编译DLL。所以dll已经签名但是它不会运行,除非我在IE设置中启用“初始化和脚本activex控件未标记为安全”。
这是我已经实施并希望将其标记为安全的文章: - Writing an ActiveX control in C#。
我在<{strong> this microsoft link上引用了安全控制概念(IObjectSafety): -
我无法理解需要放置此代码的位置。任何帮助都会使它更清晰..
答案 0 :(得分:1)
我从不同的地方收集了一些代码(和知识),这是我的工作版本 -界面:
[Serializable, ComVisible(true)]
public enum ObjectSafetyOptions
{
INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001,
INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002,
INTERFACE_USES_DISPEX = 0x00000004,
INTERFACE_USES_SECURITY_MANAGER = 0x00000008
}
//
// MS IObjectSafety Interface definition
//
[
ComImport(),
Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface IObjectSafety
{
[PreserveSig]
long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions);
[PreserveSig]
long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions);
}
和实施:
#region safe for scripting
private ObjectSafetyOptions m_options = ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_CALLER | ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_DATA;
public long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = (int)m_options;
pdwEnabledOptions = (int)m_options;
return 0;
}
public long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions)
{
return 0;
}
#endregion safe for scripting
现在IE不再显示确认对话框。