Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 如何从Visual Studio 2008安装项目向regasm注册.NET CCW_Visual Studio 2008_Installation_Registration_Ccw - Fatal编程技术网

Visual studio 2008 如何从Visual Studio 2008安装项目向regasm注册.NET CCW

Visual studio 2008 如何从Visual Studio 2008安装项目向regasm注册.NET CCW,visual-studio-2008,installation,registration,ccw,Visual Studio 2008,Installation,Registration,Ccw,我有一个.NET服务应用程序的安装项目,它使用一个.NET组件,该组件公开一个COM接口(COM可调用包装器/CCW)。 要使组件在目标机器上工作,必须向注册 regasm.exe/tlb/codebase component.dll 在这种情况下,生成typelib的/tlb开关是必需的,否则我无法从该程序集创建对象 问题是,如何配置Visual Studio 2008安装项目以通过调用regasm/tlb注册此程序集?您的服务应该具有安装程序类。 注册到OnAfterInstall事件并调用

我有一个.NET服务应用程序的安装项目,它使用一个.NET组件,该组件公开一个COM接口(COM可调用包装器/CCW)。 要使组件在目标机器上工作,必须向注册

regasm.exe/tlb/codebase component.dll

在这种情况下,生成typelib的/tlb开关是必需的,否则我无法从该程序集创建对象


问题是,如何配置Visual Studio 2008安装项目以通过调用regasm/tlb注册此程序集?

您的服务应该具有安装程序类。 注册到OnAfterInstall事件并调用RegAsm:应该从Windows目录计算路径,并绑定到特定的.Net版本

  • 在主项目(包含要注册的类的项目)中,右键单击项目文件并选择“添加/新建项”,然后选择“安装程序类”。称之为clsRegisterDll.cs
  • 在出现的设计器中,单击“单击此处切换到代码视图”,或右键单击解决方案资源管理器中的clsRegisterDll.cs文件,然后选择“查看代码”
  • 覆盖安装、提交和卸载方法,添加:

    //获取regasm的位置 字符串regasmPath=System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()+@“regasm.exe”; //获取我们的DLL的位置 string componentPath=typeof(RegisterAssembly).Assembly.Location; //执行regasm
    System.Diagnostics.Process.Start(regaspath,“/codebase/tlb\”“+componentPath+”)

    在卸载操作中为/u交换/codebase/tlb

  • 编译您的项目
  • 在安装程序中,确保已将dll添加到应用程序文件夹,然后右键单击安装程序项目并选择“查看/自定义操作”
  • 右键单击安装,然后单击添加自定义操作
  • 双击应用程序文件夹,然后单击dll
  • 对提交操作执行相同的操作
  • 构建并测试安装程序

  • 可以在以下位置找到供您尝试的实际类的演练:

    您可以使用System.Runtime.InteropServices.RegistrationServices来丢失对regasm.exe的手动调用:

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
    base.Install(stateSaver);
    
    RegistrationServices regsrv = new RegistrationServices();
    if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
    {
        throw new InstallException("Failed to register for COM Interop.");
    }
    
    }
    
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(IDictionary savedState)
    {
    base.Uninstall(savedState);
    
    RegistrationServices regsrv = new RegistrationServices();
    if (!regsrv.UnregisterAssembly(GetType().Assembly))
    {
        throw new InstallException("Failed to unregister for COM Interop.");
    }
    }
    

    这也会在卸载时注销库。

    我最初尝试从安装程序进程运行regasm(在看到此帖子之前)。尝试运行regasm并处理所有错误是有问题的,即使没有尝试处理Windows 7的提升权限


    使用
    Runtime.InteropServices.RegistrationServices.RegisterAssembly
    更干净,提供了更好的错误捕获功能。

    Visual Studio安装程序只注册COM类,但不生成和注册类型库(这是
    /tlb
    regasm.exe上切换时所做的事情
    )默认情况下。至少在Visual Studio 2017中,使用
    Tlbexp.exe
    实用程序在DLL的后期构建步骤中生成要注册的类型库就足够了

    如果安装程序项目发现扩展名为
    .tlb
    的文件位于与正在安装的库相同的目录中,并且具有相同的名称,它会自动将其包含到安装项目中,并在安装过程中执行注册步骤。当然,也可以手动生成
    .tlb
    文件并将其包含在安装项目中(并将其寄存器属性设置为
    vsdrfCOM


    下面是一个关于C#和COM接口的介绍,上面的信息来自其名为Deployment的部分。

    应该将此代码添加到哪些内容中?我有一个VB.net项目,它需要regasm,并且有一些C#依赖项。这两个方法可以添加到实现哪个超类或接口的类中?我看到这两个方法被添加到一个覆盖System.Configuration.Install.Installer的类中,然后这个类被添加为主输出?我不知道如何将此类或这些操作添加到安装程序中。它们是否会随程序集自动添加,或者我是否需要添加操作?
    “我不确定如何将此类或这些操作添加到安装程序中。”
    有关如何将其添加到安装程序包的详细信息,请参阅另一个答案中的。这个答案是对链接文章中代码的修改。