可以把 mswinsck.ocx 的安装卸载放在自定义安装操作里,在自定义卸载中不注销 mswinsck.ocx 控件。
我试试
我在自定义安装里重写了unstall方法,注销之后再注册mswinsck.ocx,为什么还是不行呢?
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
string sApplicationPath = Assembly.GetExecutingAssembly ( ).Location;
Process p = new Process();
p.StartInfo.FileName = "Regsvr32.exe";
p.StartInfo.Arguments = sApplicationPath +"\\mswinsck.ocx";//路径中不能有空格
p.Start();
}
@69217717: 你要把mswinsck.ocx作为文件包含在安装包中,然后在自定义安装中将其拷贝到系统目录下(你卸载的时候才不会把它也删除掉),然后Regsvr32注册或者自己写注册表键值(注册的路径应该是你拷贝后的路径);在卸载的时候,你可以什么都不做。
@Launcher: 我试过了,还是不行的。具体情况:1.我在窗体上添加winsock控件时,mswinsck.ocx已经注册过;2.如果mswinsck.ocx未注册,安装程序build会有错误,用这个进行安装,安装包里没有mswinsck.ocx文件的。3.将文件复制到系统目录注册后,卸载后程序还是不能运行。
@69217717: 你要明白这个原理,你就不会错误的操作了。把 mswinsck.ocx以及它依赖的dll都放在一起,安装的时候,先检查系统目录下是否有这些dll,没有则拷贝过去,然后检查注册表里是否有组件信息,如果没有或者不完整就以 mswinsck.ocx 所在目录(系统目录,因为我们都拷贝过去了)注册。
卸载的时候,如果需要在没有任何应用需要使用 mswinsck.ocx 时删除 mswinsc.ocx 的话,那么就可以先以 mswinsck.ocx 所在目录(系统目录,因为我们都拷贝过去了)注销,然后删除相关组件。
关于你的第一个问题,ocx只有在注册后才能使用,因为你是开发机,当然它一定先注册过的。但是到客户机后就不一定了。同时,你通过窗体设计器添加ocx后,它会生成互操作程序集,你应该把互操作程序集及其它依赖dll一并作为文件打包到安装包中。
当然,我们也可以在不生成互操作程序集的情况下来使用ocx,com这类组件,当然,我们还可以取巧点,把自动生成的互操作程序集反编译出来,然后作为独立的dll创建,在你的代码中使用自己创建的互操作程序集dll来访问ocx。
@Launcher: 谢谢,明白了。
你是用什么程序打包的? VS? 还是第三方的工具? 你在安装的时候注册了mswinsck.ocx 这个控件?
用vs打包的,安装时没有专门注册这个控件那,用vs开发时,如果工具栏里有winsock这个控件就已经注册了啊
你在安装的时候 做一个.bat 文件吧。。然后在这个文件里面 RegSvr32 mswinsck.ocx 这个控件。。。。但是在启动安装包需要管理员。但是在你的电脑上你开发的时候这个控件就注册了。。但是在别人的电脑上这个安装是要注册的。。当你把你的这个控件引用时。。会生成DLL文件。。你在你的项目里右击DLL查看属性: 该属性有个特定版本 你设置False 然后选择复制到本地为True。