none
类型库生成遇到的问题 RRS feed

  • 问题

  • 在VS2008下生成类型库,我之前在工程属性设置—>生成—>为COM互操作注册(打钩选择),然后编译生成DLL的时候就自动生成tlb了,可是最近再用这样的方法就失效了。怎么回事啊?

    难道都需要命令提示工具里面写命令提示才能生成并注册tlb吗?希望好心人能给我解答 ,先谢谢了

    2010年12月20日 2:10

答案

  • makinoyui  你好,

    欢迎来到来到论坛!

    通过你之前的描述,你现在的情况是能够生成dll,但是没有生成类型库tlb。我觉得你可以尝试换一种方式,比如使用命令提示工具来生成并注册tlb:

    首先把生成的XXX.dll文件(在项目目录的XXX\bin\Debug下)复制到磁盘根目录(最好别有系统盘),开始菜单 --> Vistual Studio --> Vistual Studio Tools --> Vistual Studio 命令提示。然后输入regasm XXX.dll /tlb: XXX.tlb /codebase,将类型库导入到注册表。提示成功注册了类型,说明操作成功。最后在Visual Studio命令提示符下,切换到此目录。输入tlbexp XXX.dll /out:XXX.tlb,提示成功导出tlb类型库文件。

    以下是一些关于类型库导出的链接:

    1、关于类型库导出程序 (Tlbexp.exe):http://msdn.microsoft.com/zh-cn/library/hfzzah2c(VS.80).aspx

    2、关于生成dll和tlb:http://hi.baidu.com/djiz/blog/item/db206bf070efbfa6a50f524e.html

    希望以上信息能够对你有所帮助。如果有什么不清楚的地方,请随时让我们知道。

    谢谢你的理解和支持

    Mio 


    Mio Miao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 makinoyui 2010年12月22日 0:54
    2010年12月21日 8:20
    版主

全部回复

  • 有些类型库不支持直接生成这个吧

    你检查一下是否是这个原因,还有,如果不能生成是否有错误提示?


    family as water
    2010年12月20日 4:38
  • 编译的时候没有错误,dll是可以成功生成的,就是没有类型库

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.EnterpriseServices;

    namespace ICOM2
    {
        [
            System.Runtime.InteropServices.ComVisible(true),
            System.Runtime.InteropServices.Guid("A3131A03-9316-4544-A875-C182D767BE13")
        ]
        public interface ICOM2
        {
            int rectangle_area(int length, int height);
            double circle_area(double r);
            int GetX();
            int GetY();
        }
        [
            System.Runtime.InteropServices.ComVisible(true),
            System.Runtime.InteropServices.Guid("E321328B-5E87-4d41-A904-0553910C66A8")
        ]
        public class ClassICOM2 : ICOM2
        {
            public int parameter1;//属性需要在接口中声明吗?怎么声明啊?
            public int parameter2;
            public ClassICOM2(int p1, int p2)
            {
                parameter1 = p1;
                parameter2 = p2;
            }
            public double Prop1
            {
                get { return parameter1; }

            }
            public double Prop2
            {
                get { return parameter2; }

            }
            public int GetX()
            {
                return parameter1;
            }
            public int GetY()
            {
                return parameter2;
            }
            public int rectangle_area(int length, int height)
            {
                int area;
                area = length * height;
                return area;
            }
            public double circle_area(double r)
            {
                double area;
                const double pi = 3.1415926535897931;
                area = pi * r * r;
                return area;
            }
        }
    }

    AssemblyInfo.cs的代码

    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    using System.EnterpriseServices;


    [assembly: AssemblyTitle("ICOM2")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("番茄花园")]
    [assembly: AssemblyProduct("ICOM2")]
    [assembly: AssemblyCopyright("Copyright © 番茄花园 2010")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]


    [assembly: ComVisible(true)]
    [assembly: Guid("ed316bc2-64bc-45a8-b535-d9a98c411be9")]
    [assembly: System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]

    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]


    try again!never stop~~
    2010年12月20日 6:23
  • 我看了一下代码,原因是您的 COM 接口和实现缺少了一下关键的东西,比如除了 Guid,还需要一些如 DispId,ClassInterface,CoClass 等 Attribute 修饰。详细请参考 C# 如何生成 COM 服务器程序集。这个话题 MSDN 里面是有的。

    另外,注册 TLIB 和 DLL 是必须的,请参考使用 regasm。

    还有,注册成功后,您应该可以通过 Visual Studio 工具中的 COM-OLE 查看器看到您的 COM 服务器信息的,您也可以参考。


    Mark Zhou
    2010年12月20日 7:04
  • 我之前写的代码比这个还要少呢也能实现呢,不过还是谢谢你, 我再去查查看~
    try again!never stop~~
    2010年12月20日 7:21
  • makinoyui  你好,

    欢迎来到来到论坛!

    通过你之前的描述,你现在的情况是能够生成dll,但是没有生成类型库tlb。我觉得你可以尝试换一种方式,比如使用命令提示工具来生成并注册tlb:

    首先把生成的XXX.dll文件(在项目目录的XXX\bin\Debug下)复制到磁盘根目录(最好别有系统盘),开始菜单 --> Vistual Studio --> Vistual Studio Tools --> Vistual Studio 命令提示。然后输入regasm XXX.dll /tlb: XXX.tlb /codebase,将类型库导入到注册表。提示成功注册了类型,说明操作成功。最后在Visual Studio命令提示符下,切换到此目录。输入tlbexp XXX.dll /out:XXX.tlb,提示成功导出tlb类型库文件。

    以下是一些关于类型库导出的链接:

    1、关于类型库导出程序 (Tlbexp.exe):http://msdn.microsoft.com/zh-cn/library/hfzzah2c(VS.80).aspx

    2、关于生成dll和tlb:http://hi.baidu.com/djiz/blog/item/db206bf070efbfa6a50f524e.html

    希望以上信息能够对你有所帮助。如果有什么不清楚的地方,请随时让我们知道。

    谢谢你的理解和支持

    Mio 


    Mio Miao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 makinoyui 2010年12月22日 0:54
    2010年12月21日 8:20
    版主
  • 谢谢你~~~
    try again!never stop~~
    2010年12月22日 0:55