0 0

vs2005 c# 下开发activex控件,可是在调试运行后没有生成exe 文件,只有dll文件5

vs2005 c# 下开发activex控件,可是在调试运行后没有生成exe 文件,只有dll文件,现在要做它的安装程序了,可是没有exe文件是不是不行啊

问题补充:
yqin 写道

这个我已经看过了,不行啊,因为是第一次写activex 程序,所以有太多的不懂了
2011年1月06日 11:05

3个答案 按时间排序 按投票排序

0 0

为完成网页自动下载并安装控件的功能,需要通过C#创建一个ActiveX控件,然后将该控件置于安装程序中,在打开网页的时候下载、安装并注册该ActiveX控件。本文是采用VS2005创建的,VS2003创建过程与之相似。

    首先,创建一个类库,为其命名为CreateActiveXEmail:



    删除掉默认生成的类Class1.cs,创建一个接口ActiveXEmailInterface:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace CreateActiveXEmail
...{
    [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ActiveXEmailInterface
    ...{
        void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions);
        void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions);
    }
}
    其中GUID可以通过【工具】-【创建GUID】来产生。

    实现该接口的目的就是提高程序的安全性,以便客户端IE在不更改设置的情况下可以预行该ActiveX控件。

    然后,用你需要实现某些功能的类来继承上面的接口。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CreateActiveXEmail
...{
    [Guid("060d1308-f34e-4c9f-8962-0abafe385d33"), ComVisible(true)]
    public class ActiveXEmail : ActiveXEmailInterface
    ...{
        public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
        ...{
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }

        public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
        ...{
        }

        public ActiveXEmail()
        ...{
        }
    }
}
    注意,上面代码中的类属性“ComVisible(true)”,是必须添加的。

    在上面的类中,仅仅是现实了接口的两个方法,至于其他需要的方法,自行添加即可。另外,需要对项目属性进行一点修改:



    注意,类属性中的“ComVisible(true)”和上图中的【为 COM Interop 注册】缺一不可!只有这样才能生成tlb文件。

    这样,一个可用的ActiveX控件就已经生成。在本机你可以随意调用其中的任何方法,但问题是,当客户端机器需要远程调用时,必须在能在客户端机器上注册该ActiveX控件才行。所以,还必须进行下面的步骤:将该ActiveX打包,在安装后在目标机器进行注册。

    创建一个安装包:



    然后右键单击项目,点击【添加】-【项目输出】,在【主输出】中选择上面创建的工程“CreateActiveXEmail”。然后,打开安装工程的【属性】页面,对项目的【安装URL】项进行设置:



注意,上图的【安装URL】项中,必须使用绝对路径。另外,上图中的“DllFolder”是一个已发布网站“http://172.16.11.136/TestingAX”下的一个目录,这意味着,当在客户端访问页面时,如果客户端未安装当前ActiveX控件,则从路径http://172.16.11.136/TestingAX/DllFolder”来下载。

    最后,在页面中按如下方法调用即可:

<object classid="clsid:060d1308-f34e-4c9f-8962-0abafe385d33"
               codebase="DllFolder/setup.exe#version=1,0,0,0"></object>
另外,还可以采用其他方法,即上面的类库属性不选择【为 COM Interop 注册】,安装工程属性不为【安装URL】指定路径,类中也不添加“ComVisible(true)”属性,而是创建一个安装类:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Reflection;
using System.IO;
using Microsoft.Win32;
using System.Diagnostics;

namespace CreateActiveXEmail
...{
    [RunInstaller(true)]
    public partial class CustomInstaller : Installer
    ...{
        private string regCommandFile = string.Empty;
        private string unRegCommandFile = string.Empty;

        public CustomInstaller()
        ...{
            InitializeComponent();
        }

        protected override void OnAfterInstall(System.Collections.IDictionary savedState)
        ...{
            base.OnAfterInstall(savedState);

            try
            ...{
                //get the path of the Regasm.exe
                string regasmPath = string.Empty;

                //get the path of the current executing assembly
                string currentAsmDLLFilePath = Assembly.GetExecutingAssembly().Location;
                string currentAsmPath = currentAsmDLLFilePath.Substring(0, currentAsmDLLFilePath.LastIndexOf('\') + 1);

                string currentRegasmPath = string.Format("{0}{1}", currentAsmPath, "RegAsm.exe");
                if (!File.Exists(currentRegasmPath))
                ...{
                    try
                    ...{
                        RegistryKey frmReg = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoft.NETFramework");
                        if (frmReg == null)
                        ...{
                            //the .net framework do not exist in the local machine
                            return;
                        }

                        string frameworkVersion = Environment.Version.ToString();
                        frameworkVersion = frameworkVersion.Substring(0, frameworkVersion.LastIndexOf('.'));

                        regasmPath = string.Format(@"{0}v{1}{2}", frmReg.GetValue("InstallRoot").ToString(), frameworkVersion, "RegAsm.exe");

                        if (!File.Exists(regasmPath))
                        ...{
                            //the Regasm.exe do not exist in the local machine
                            return;
                        }
                    }
                    catch (System.ArgumentException ex)
                    ...{
                        throw new System.ArgumentException(ex.Message);
                    }
                }
                else
                ...{
                    regasmPath = currentRegasmPath;
                }

                //create the registration command line
                string regCommand = string.Format("{0} "{1}" /{2} /{3}", regasmPath, currentAsmDLLFilePath, "tlb", "codebase");               
               
                try
                ...{
                    regCommandFile = string.Format("{0}{1}", currentAsmPath, "Regasm.bat");
                    if (File.Exists(regCommandFile))
                    ...{
                        File.Delete(regCommandFile);
                    }

                    using (StreamWriter swReg = File.CreateText(regCommandFile))
                    ...{
                        swReg.Write(regCommand);
                        swReg.Flush();
                    }
                }
                catch (UnauthorizedAccessException uaex)
                ...{
                    throw new UnauthorizedAccessException(uaex.Message);
                }
                catch (DirectoryNotFoundException dnex)
                ...{
                    throw new DirectoryNotFoundException(dnex.Message);
                }
                catch (IOException ioex)
                ...{
                    throw new IOException(ioex.Message);
                }

                //create the unregistration command file
                string unRegCommand = string.Format("{0} "{1}" /{2}", regasmPath, currentAsmDLLFilePath, "u");

                try
                ...{
                    unRegCommandFile = string.Format("{0}{1}", currentAsmPath, "UnRegasm.bat");
                    if (File.Exists(unRegCommandFile))
                    ...{
                        File.Delete(unRegCommandFile);
                    }

                    using (StreamWriter swReg = File.CreateText(unRegCommandFile))
                    ...{
                        swReg.Write(unRegCommand);
                        swReg.Flush();
                    }
                }
                catch (UnauthorizedAccessException uaex)
                ...{
                    throw new UnauthorizedAccessException(uaex.Message);
                }
                catch (DirectoryNotFoundException dnex)
                ...{
                    throw new DirectoryNotFoundException(dnex.Message);
                }
                catch (IOException ioex)
                ...{
                    throw new IOException(ioex.Message);
                }

                //register for the COM Interop
                Process.Start(regCommandFile);
            }
            catch (Exception ex)
            ...{
                throw new Exception(ex.Message);
            }
        }

        public override void Uninstall(System.Collections.IDictionary savedState)
        ...{
            try
            ...{
                Process.Start(unRegCommandFile);
            }
            catch (Exception ex)
            ...{
                throw new Exception(ex.Message);
            }

            base.Uninstall(savedState);
        }
    }
}
    因为没有了“ComVisible(true)”和【为 COM Interop 注册】,工程也就无法生成tlb文件,没有tlb文件也就意味着注册失败,dll文件或ActiveX控件在客户端无法使用。上面的类就是通过代码的方式将dll文件在客户端注册,生成tlb文件。

     当然,这种方法写的东西比较多点,只是提供一种思路,为其他可能的项目准备

2011年1月06日 11:29
0 0

ActiveX 不是 exe ,一般是在浏览器这样的 exe 下运行,浏览器会调用他们的。

看看这篇文章吧 http://hi.baidu.com/buxiaolei/blog/item/77302bf50ac9fc21bc310931.html

2011年1月06日 11:10
0 0

看看这个
http://wenku.baidu.com/view/54769b0d6c85ec3a87c2c542.html

2011年1月06日 11:09

相关推荐

    C#开发ActiveX控件

    本文将深入探讨如何使用C#来开发ActiveX控件,这些控件主要用于增强网页交互性,尤其是在Internet Explorer浏览器中。ActiveX控件是微软在90年代末提出的一种技术,它允许开发者创建可嵌入网页的迷你应用程序,为...

    VS2005下使用C#开发ActiveX控件【原创】.doc

    【标题】: 在VS2005下使用C#开发ActiveX控件 【描述】: 本文档详细介绍了如何在Visual Studio 2005 (VS2005)环境中利用C#语言开发ActiveX控件。作者分享了个人的实践经验和步骤,旨在帮助开发者解决在VS2005环境下...

    VS2008(c#)开发ActiveX控件、访问及制作CAB包总结

    在本文中,我们将深入探讨如何使用Visual Studio 2008 (C#) 开发ActiveX控件,以及如何创建和打包CAB文件,以便在网页中使用和更新。ActiveX技术允许开发者创建可以在多种应用程序中使用的组件,尤其是在网页中通过...

    C# 开发的ActiveX控件

    至于"RuiXunActiveX",这可能是作者编写的C# ActiveX控件的源代码或编译后的DLL文件。通过查看和分析这个文件,我们可以学习作者是如何实现特定功能的,比如事件处理、用户交互逻辑或错误处理。 总的来说,C#开发...

    C# 开发Activex控件

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、Web服务和.NET框架下各种组件时。ActiveX控件是微软提出的一种技术,它允许开发者创建可重用的组件,这些组件可以在不同的应用程序中嵌入,...

    使用C#开发ActiveX控件全攻略

    【使用C#开发ActiveX控件全攻略】 ActiveX控件是Microsoft的一种技术,它基于组件对象模型(Component Object Model,简称COM),在分布式环境中,COM可以转变为分布式COM(DCOM)。ActiveX控件最初是为了对抗Sun ...

    使用C#开发ActiveX控件

    标题中提到的“使用C#开发ActiveX控件”实际上是指如何在C#环境下创建能够与ActiveX组件相互作用的代码,而不是直接用C#编写ActiveX控件本身。C#本身并不支持直接生成ActiveX控件,但可以通过COM互操作技术来调用和...

    VS2012C#开发ActiveX控件、生成MSI与制作CAB文件

    3. 将你的ActiveX控件DLL和其他依赖文件添加到安装项目中。 4. 配置安装逻辑,如文件复制、注册表项设置、启动菜单快捷方式等。 5. 生成安装包,用户可以通过运行生成的MSI文件来安装你的软件。 最后,制作CAB( ...

    使用VS2008 C#_开发ActiveX控件

    ### 使用VS2008与C#开发ActiveX控件详解 #### 一、前言 随着互联网技术的发展,B/S架构的应用越来越广泛。在这样的背景下,开发网页插件变得尤为重要,例如输入控件、打印控件等。这些插件能够极大地提升用户的...

    C++和C#编写Activex控件并进行网页调用

    1. **安全设置**:由于ActiveX控件涉及客户端安全,因此需要在浏览器的安全设置中允许来自特定站点的ActiveX控件运行。 2. **脚本交互**:在HTML页面中,可以通过JavaScript与ActiveX控件交互,调用其方法和访问属性...

    使用C#开发ActiveX控件及制作CBA

    在本教程中,我们将探讨如何使用C#在Visual Studio 2010环境下创建ActiveX控件,并制作Component Binary Archive(CBA)。 一、什么是ActiveX控件 ActiveX控件是基于COM(Component Object Model)技术的二进制组件...

    C#web 开发ActiveX控件、生成MSI与制作CAB文件,更新msi

    在C#中开发ActiveX控件,主要是为了创建可以在网页中使用的交互式组件。ActiveX控件是基于COM(Component Object Model)技术的,它允许软件组件之间进行交互和通信。在VS2010环境下,你可以按照以下步骤来创建和...

    Visual_Studio_2008(c#)开发ActiveX控件及制作CAB包及数字签名总结.rar

    2. 添加项目输出:在安装项目中,添加你的ActiveX控件项目的输出,这将包含控件的DLL文件和其他相关文件。 3. 配置CAB包:设置CAB包的属性,如版本信息、依赖项等。确保所有必需的文件都被包含在内,以便用户能够...

    C#开发ActiveX控件及控件的发布

    本文将详细介绍如何在Visual Studio 2005环境下使用C#来开发和发布ActiveX控件。 **一、理解ActiveX控件** ActiveX控件是基于COM(Component Object Model)技术的,它们是自包含的、可执行的二进制文件,可以在...

    C# ActiveX控件开发源码

    总结来说,"C# ActiveX控件开发源码"是关于使用C#语言在.NET Framework下创建和实现ActiveX控件的实践。这涉及到COM组件的概念、C#的COM互操作性以及如何在Visual Studio中进行项目设置和部署。虽然ActiveX技术在...

    c# activex 控件

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows应用程序、Web应用程序以及服务器端应用时。在本主题中,我们将深入探讨“C# Activex控件”及其与HTML的交互,这是一项允许在网页中嵌入和使用C#编写的...

    C#编写activex控件

    创建一个ActiveX控件库(ATL项目),然后在其中引用C#编译后的DLL文件。这将生成一个TLB(Type Library)文件,Web页面可以使用此文件与ActiveX控件进行通信。 6. **使用ActiveX控件**: 在HTML页面中,通过`...

    c#开发Activex控件

    1. **编译项目**:在完成控件的开发后,需要编译项目生成DLL文件。 2. **注册控件**:使用`Regasm.exe`工具注册控件,将它添加到系统注册表,以便其他应用程序可以找到并使用它。 3. **创建ActiveX包装**:使用`...

Global site tag (gtag.js) - Google Analytics