我需要远程加载包含ActiveX对象(非可视)的.NET DLL,然后使用新的ActiveXObject()方法通过
javascript访问它.
目前IE8正在使用对象标记上的codebase属性的路径正确加载此DLL,但由于ActiveX引导程序未在注册表中找到DLL,因此ActiveXObject失败.
我正在使用ProcMon来跟踪正在发生的事件,并且可以验证是否正在下载DLL,并且新的ActiveXObject方法正在探测注册表.因为ActiveX对象不在注册表中,所以第二部分失败了.
<body>
<object
name="Hello World"
classid="clsid:E86A9038-368D-4e8f-B389-FDEF38935B2F"
codebase="http://localhost/bin/Debug/Test.ActiveX.dll">
</object>
<script type="text/javascript">
var hw = new ActiveXObject("Test.ActiveX.HelloWorld");
alert(hw.greeting());
</script>
</body>
如果我使用regasm我可以提供必要的注册然后一切正常,但我不想为此目的部署安装程序 – 我知道IE应该为我注册DLL – 我只是不知道什么机制做这个.
.NET类具有必要的属性,使这一切都在regasm中工作,但似乎没有调用注册表代码. (注册代码从here挖出)
namespace Test
{
[Guid("E86A9038-368D-4e8f-B389-FDEF38935B2F")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IHelloWorld
{
[DispId(0)]
string Greeting();
}
[ComVisible(true)]
[ProgId("Test.ActiveX.HelloWorld")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IHelloWorld))]
public class HelloWorld : IHelloWorld
{
[ComRegisterFunction()]
public static void RegisterClass(string key)
{
// Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
StringBuilder sb = new StringBuilder(key);
sb.Replace(@"HKEY_CLASSES_ROOT\ ", ""); // <-- extra space to preserve prettify only.. not in the real code
// Open the CLSID\{guid} key for write access
using (RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true))
{
// And create the 'Control' key - this allows it to show up in
// the ActiveX control container
using (RegistryKey ctrl = k.CreateSubKey("Control"))
{
ctrl.Close();
}
// Next create the CodeBase entry - needed if not string named and GACced.
using (RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true))
{
inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
inprocServer32.Close();
}
// Finally close the main key
k.Close();
}
}
...
public string Greeting()
{
return "Hello World from ActiveX";
}
}
}
最佳答案 这个问题的简单答案是你做不到; IE不会加载它不知道的activex控件.
你可以做的是找到一种方法来安装DLL(从而注册ActiveX控件),然后在安装后加载它.在本地,如果没有来自用户的任何提示,这是不可能“自动”进行的,可能是因为那将是一个噩梦般的安全漏洞.
现在,如果您只是在寻找ActiveX控件的“本机”安装方法,那么这将是您指定的CAB文件.它不会“自动”为您完成所有操作,但它可以用于让IE提示用户安装ActiveX控件,这将导致您的安装程序运行.
您可以在http://msdn.microsoft.com/en-us/library/aa751974(v=vs.85).aspx找到有关如何使用此方法的信息
在C#中做你想做的事情可能不是一个非常灵活的方法;它只有在用户安装了.net时才有效,而且我从未尝试过使用CAB文件来安装.net ActiveX控件.我建议您考虑使用常规浏览器插件或C ActiveX控件.您可以查看FireBreath在C中创建可用作ActiveX控件但在所有其他浏览器上的内容.