VC ++ 6.0从COM DLL生成.TLH导致错误

时间:2012-03-19 12:38:47

标签: c++ .net dll typelib

问题是,我有一个我在C#.NET中创建的DLL和TLB,它使COM可见并希望将这些函数公开给我的MFC C ++项目 - 我先创建了一个测试类,它运行正常,并且没有从C ++生成的tlh中得不到任何错误。现在我想要使用的实际DLL给出了以下编译错误:

error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'

从以下C ++生成的tlh文件:

//
// Type library items
//

struct __declspec(uuid("d6b19eb0-56bf-3c30-9f3a-ebafca303996"))
Class1;
// [ default ] interface _Class1
// interface _Object

struct __declspec(uuid("a7e7ae20-5fb3-3c3f-a9fb-1fac0128dea1"))
IProtracReader : IDispatch
{}

struct TagReadEvent
{
__int64 <Index>k__BackingField;     <<< These three lines are where the errors are.
__int64 <TagID>k__BackingField;
DATE <EventMoment>k__BackingField;
};

有谁知道为什么编译器会生成这个给我错误的文件?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

这些是使用自动属性时由C#编译器生成的字段。像:

[ComVisible(true)]
public class TagReadEvent {
    public long Index { get; set; }
    // etc...
}

你应该回去修复C#代码。还使用接口并将类/结构保存为[ClassInterface(ClassInterfaceType.None)],以便不暴露任何实现。 COM的方式。如果你不能,那么你可以使用#import指令中的 exclude 属性来跳过麻烦制造者。像:

#import "something.dll" exclude("TagReadEvent")

重命名属性也可以修复它。