【问题标题】:c# hide class members when exporting DLLc# 导出DLL时隐藏类成员
【发布时间】:2016-02-09 10:40:00
【问题描述】:

当我将 DLL 发布到第三方应用程序时,我能否只让最终用户可以看到某些方法?

我的代码建立在 7-8 个不同的项目之上,这些项目相互调用,它们有不同的命名空间,例如“Company.ProjectName”,我认为这与“Company" 命名空间,我只希望其中一个项目(BTW 定义了接口)对外界可见。

解决方案中的每个项目都编译成 DLL,然后我使用 ILASM 将它们组合起来。

顺便说一句,解决方案中还有其他项目使用这些与此 dll 无关。

编辑:即使命名空间的构造类似于 "CompanyName.Project1"、"CompanyName.Project2" ,internal 关键字是否有效?他们会见面吗?

【问题讨论】:

  • 您可以将所有班级成员作为您不想导出的内部构件

标签: c# dll .net-assembly ilasm


【解决方案1】:

你不需要组合它们,你只需要一个friend assembly

当您正在开发一个类库并且对库的添加包含在单独的程序集中但需要访问标记为朋友 (Visual Basic) 或内部 (C#) 的现有程序集中的成员时。
...
只有明确指定为好友的程序集才能访问好友 (Visual Basic) 或内部 (C#) 类型和成员。

InternalsVisibleTo 属性:

[assembly: InternalsVisibleTo("AssemblyB")]   

有助于将其锁定,以便只有指定的程序集可以访问internal 项目。

(回答您的编辑:这是在程序集级别指定的,与命名空间无关)。

【讨论】:

  • 我试过了,但没有运气。我在AssemblyB 参数中写了命名空间、类名等所有内容,但它不起作用。
  • 您需要具体向我们展示什么不起作用 - 否则我们只能猜测问题所在。您是否尝试过此操作但仍尝试合并程序集?
  • 我把它写在命名空间下,到类,我把它移到命名空间然后它工作了:) 谢谢。
【解决方案2】:

使用internal

请看下面的例子

public class MyPublicClass
{

    public void DoSomething()
    {
        var myInternalClass = new MyInternalClass();
        myInternalClass.DoSomething();
    }
}

internal class MyInternalClass
{

    public void DoSomething()
    {
    }
}

在您的 DLL 中,MyPublicClass 将对外部用户可见 - 那些引用您的 DLL 的人。

MyInternalClass 将不可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多