日期:2014-05-18  浏览次数:20905 次

请问用C#写了COM组件,怎么在没有VS的机器上面注册呢?
我建立了一个 C# 类库的工程并在属性里面勾选了“注册为COM组件”,编写了如下的代码。

C# code

    [Guid("F927F24C-6A4B-463F-80EA-5082FFA1B440")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IZLActiveXEvent))]
    public class ZLActiveX : IZLActiveX
    {
        public int Synchron(string path)
        {
            try
            {
                MessageBox.Show("Hit");
            }
                return 0;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return -1;
            }
        }
    }

    [Guid("E7525AFD-D231-4F64-98DA-0000F55C2173")]
    [ComVisible(true)]
    public interface IZLActiveX
    {
        [DispId(0x00000002)]
        int Synchron(string path);
    }

    [Guid("59D5AD91-7D85-48BB-8199-0F29025A7A9D")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IZLActiveXEvent
    {
    }



同时在网页上面利用下面的JS代码调用这个COM组件。
JScript code

<object name="ZLActiveX" id="ZLActiveX" classid="clsid:F927F24C-6A4B-463F-80EA-5082FFA1B440"></object>
<script language="javascript" type="text/javascript">
    function buttonSynchron_Click()
    {
        ZLActiveX.Synchron("");
    }
</script>



当我点击下面的按钮时,调用JS来调用C#编写的COM组件。
HTML code

<input type="button" name="buttonSynchron" id="buttonSynchron" value="Synchron" onclick="buttonSynchron_Click();"/>



在主机上编写完成并编译成功了,在页面上面可以正确地运行。网页可以正确地调用COM组件。

但我把这个网页和COM组件对应的DLL文件考到另外一台没有装VS的电脑上(此电脑已经装了对应的.Net Frameworks了),用RegAsm.exe这个程序进行注册,显示注册成功了,但网页上无法调用COM组件。

显示的错误如下。
是网页中JS的这一句,找不到对应的函数或者方法。
ZLActiveX.Synchron("")

请问这如何是好,请指点。

------解决方案--------------------
使用 regsvr32 注册
------解决方案--------------------

string ddVueOcxFile = string.Format("{0}\\Data\\ddVue.ocx", Application.StartupPath);
if (!File.Exists(ddVueOcxFile))
{
MessageBox.Show("ddVue.ocx被非法移动!");
return false;
}
string regsvr32Para = "\"" + ddVueOcxFile + "\"";
System.Diagnostics.Process p = System.Diagnostics.Process.Start("regsvr32", regsvr32Para + " /s");

if (p != null && p.HasExited)
{
Int32 exitCode = p.ExitCode;
if (exitCode == 0)
{//注册成功
return true;
}
}
------解决方案--------------------
Q:请问用C#写了COM组件,怎么在没有VS的机器上面注册呢?
A:装.net

------解决方案--------------------
regsvr32好象不可以。
.net开发的com好象是一个特殊命令。好象是这个 REGSAM msdn上有详细说明。