从 C# 导出 COM 组件时的命名(小写/大写)问题

发布于 2024-12-02 03:15:18 字数 588 浏览 0 评论 0原文

我有一个 C# COM DLL,它定义了我从 C++ ATL/COM 服务器使用的一些接口/类型。 有时,无论是在我的机器上,还是随机在我构建相同项目(ATL *.exe 和 C# DLL)的其他机器上,我都会遇到与作为 COM 一部分的导出 C# 结构成员相关的不同编译错误界面。下面是一个示例:

public enum TemporaryPolicyType
{
    UntilTime = 0,
    ForNextMinutes
}

[Guid("6F8CD968-DA76-44CA-B4E1-C495AB5003BD")]
public struct TemporaryPolicyData
{
    public TemporaryPolicyType Type;
    public DateTime Timestamp;
    public DateTime EndTime;
    public int EchartMinutes;
}

例如,在这种特殊情况下,C# 将有时“导出”,在某些机器上,成员“Type”使用小写字母,而在其他一些机器上则像在代码中一样使用它会工作得很好。

我用的是VS 2010。

I have a C# COM DLL that defines some interfaces/types that I use from a C++ ATL/COM server.
From time to time, be it on my machine, or randomly on other machines where I build the same projects (the ATL *.exe and the C# DLL) I get different compile errors related to exported C# struct members that are part of the COM interface. Here is an example:

public enum TemporaryPolicyType
{
    UntilTime = 0,
    ForNextMinutes
}

[Guid("6F8CD968-DA76-44CA-B4E1-C495AB5003BD")]
public struct TemporaryPolicyData
{
    public TemporaryPolicyType Type;
    public DateTime Timestamp;
    public DateTime EndTime;
    public int EchartMinutes;
}

For example in this particular case, C# will "export" sometimes, on some machines, member "Type" with lowercase letters, and on some other machines using it like it is in code will work just fine.

I am using VS 2010.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如何视而不见 2024-12-09 03:15:18

这是类型库的一个已知问题。事实上,它是出于非常隐晦的原因而设计的,几乎可以肯定与不知道读取类型库的编译器是否对大小写敏感有关。 Basic 编译器不是,C++ 编译器是。然而,修复很粗糙,它没有按用途对标识符进行分类。

如果结构声明之前的任何声明也包含名为“type”的标识符,则其余标识符将使用第一个标识符的字母大小写。最意想不到的情况是它是方法参数的名称,通常以小写形式编写。如果“Type”是属性的名称,那么它将被重命名为“type”,这真是太糟糕了。粗制滥造的部分。

唯一的解决方法是使用一个更具体、不冲突的名称。

This is a known problem with type libraries. It is in fact by design for very obscure reasons, almost certainly having something to do with not knowing whether the compiler that reads the type library is sensitive to casing. A Basic compiler is not, a C++ compiler is. The fix was crude however, it does not classify the identifier by usage.

If any declaration before your structure declaration also contains an identifier named "type" then the rest of the identifiers will use the letter casing of that first one. The most unexpected case is when it is the name of a method parameter, most typically written in lower-case. Bummer if "Type" is the name of, say, a property, it will be renamed to "type". The crude part.

The only workaround is to use a more specific name that doesn't clash.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文