首页 新闻 搜索 专区 学院

vs2008 程序打包后卸载问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-12-06 09:10

我用vs2008开发了一个时间校时程序(winform),并进行了打包。打包后程序可以安装、卸载,但是卸载过程把mswinsck.ocx也卸了,导致有winsock控件的其他程序都不能运行,要重新添加mswinsck.ocx才可以。

我想问问有没有什么方法,在使用卸载程序时不要把mswinsck.ocx也卸了?

69217717的主页 69217717 | 初学一级 | 园豆:157
提问于:2012-11-15 10:10
< >
分享
最佳答案
0

可以把 mswinsck.ocx 的安装卸载放在自定义安装操作里,在自定义卸载中不注销 mswinsck.ocx 控件。

收获园豆:45
Launcher | 高人七级 |园豆:45045 | 2012-11-15 10:18

我试试

69217717 | 园豆:157 (初学一级) | 2012-11-15 10:21

我在自定义安装里重写了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 | 园豆:157 (初学一级) | 2012-11-22 14:05

@69217717: 你要把mswinsck.ocx作为文件包含在安装包中,然后在自定义安装中将其拷贝到系统目录下(你卸载的时候才不会把它也删除掉),然后Regsvr32注册或者自己写注册表键值(注册的路径应该是你拷贝后的路径);在卸载的时候,你可以什么都不做。

Launcher | 园豆:45045 (高人七级) | 2012-11-22 14:40

@Launcher: 我试过了,还是不行的。具体情况:1.我在窗体上添加winsock控件时,mswinsck.ocx已经注册过;2.如果mswinsck.ocx未注册,安装程序build会有错误,用这个进行安装,安装包里没有mswinsck.ocx文件的。3.将文件复制到系统目录注册后,卸载后程序还是不能运行。

69217717 | 园豆:157 (初学一级) | 2012-12-05 10:55

@69217717: 你要明白这个原理,你就不会错误的操作了。把 mswinsck.ocx以及它依赖的dll都放在一起,安装的时候,先检查系统目录下是否有这些dll,没有则拷贝过去,然后检查注册表里是否有组件信息,如果没有或者不完整就以 mswinsck.ocx 所在目录(系统目录,因为我们都拷贝过去了)注册。

卸载的时候,如果需要在没有任何应用需要使用 mswinsck.ocx 时删除 mswinsc.ocx 的话,那么就可以先以 mswinsck.ocx 所在目录(系统目录,因为我们都拷贝过去了)注销,然后删除相关组件。

关于你的第一个问题,ocx只有在注册后才能使用,因为你是开发机,当然它一定先注册过的。但是到客户机后就不一定了。同时,你通过窗体设计器添加ocx后,它会生成互操作程序集,你应该把互操作程序集及其它依赖dll一并作为文件打包到安装包中。

当然,我们也可以在不生成互操作程序集的情况下来使用ocx,com这类组件,当然,我们还可以取巧点,把自动生成的互操作程序集反编译出来,然后作为独立的dll创建,在你的代码中使用自己创建的互操作程序集dll来访问ocx。

Launcher | 园豆:45045 (高人七级) | 2012-12-05 11:07

@Launcher: 谢谢,明白了。

69217717 | 园豆:157 (初学一级) | 2012-12-06 09:09
其他回答(2)
0

你是用什么程序打包的? VS? 还是第三方的工具? 你在安装的时候注册了mswinsck.ocx 这个控件?

夏狼哉 | 园豆:833 (小虾三级) | 2012-11-15 10:16

用vs打包的,安装时没有专门注册这个控件那,用vs开发时,如果工具栏里有winsock这个控件就已经注册了啊

支持(0) 反对(0) 69217717 | 园豆:157 (初学一级) | 2012-11-15 10:20
0

你在安装的时候 做一个.bat 文件吧。。然后在这个文件里面 RegSvr32 mswinsck.ocx 这个控件。。。。但是在启动安装包需要管理员。但是在你的电脑上你开发的时候这个控件就注册了。。但是在别人的电脑上这个安装是要注册的。。当你把你的这个控件引用时。。会生成DLL文件。。你在你的项目里右击DLL查看属性: 该属性有个特定版本  你设置False  然后选择复制到本地为True。

收获园豆:5
在 水 一 方 | 园豆:1097 (小虾三级) | 2012-11-16 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册