3

我正在为我的项目添加一个 dll。我的项目在 vb.net 中,而 dll 是用 c#.net 编写的。当我将此添加到 vb.net 项目时,可用的属性与将相同的 dll 添加到 ac# 项目时可用的属性不同(数量较少)。

添加到 VB.Net 项目时的对象浏览器视图 在此处输入图像描述

添加到 ac# 项目时的对象浏览器视图 添加到 ac# 项目时的对象浏览器视图

如果您在 c# 视图中看到,您可以访问在 vb.net 中无法访问的属性,例如“hits”和“facets”。

谁能帮我理解这个问题。

4

3 回答 3

6

VB.NET 和 C# 之间存在差异。确保在编译 C# dll 时将程序集属性CLSCompliant设置为 true,以便编译器可以确定您的所有 public 是否与其他 .NET 语言兼容。

于 2013-06-17T12:15:41.500 回答
0

为了澄清我的情况,我正在使用从 github 下载的 dll。当我从 github 下载源代码时,我发现它不是 CLSComplaint。当我更改属性名称并添加 DataMember 属性(用于 jsonserilzation)时,所有属性在 vb.net 项目中也可用,但我将面临的问题是将代码更改合并到原始特定类库中的任何更新在与作者交谈之前,我不想提交给 GitHub 的 CLSComplaint 版本。

作为一种解决方法,我添加了 GetHitCount(CLSComplaint property name)

public int GetHitCount
{
    get { return hits.total;}
}

这会暴露在将 dll 添加到 vb.net 项目时不可用的“命中”属性。

于 2013-06-17T14:51:59.593 回答
0

C# 项目中的“hits”和“facets”很可能在类中具有相同名称但大小写不同的成员。对于引用 C# dll 的 VB 项目来说,这是一个非常常见的问题,它还会导致 C# dll 不符合 CLS。VB 不区分大小写,因此如果还有一个“Hits”成员,它就无法确定需要哪些“Hits”——因此 VB 不会显示任何一个成员。

您仍然可以调用“hits”和“facets”,但您需要使用“InvokeMember”来执行此操作(使用反射)。

于 2013-06-17T15:03:52.243 回答