c#导出DLL时隐藏类成员

时间:2016-02-09 10:40:01

标签: c# dll .net-assembly ilasm

在向第三方应用程序发布DLL时,我是否只能让最终用户看到一些方法?

我的代码基于7-8个不同的项目,互相称呼,它们有不同的名称空间,例如“ Company.ProjectName ”,我认为这些名称与“< strong>公司“命名空间,我只希望其中一个项目(其界面定义为BTW)对外部世界可见。

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

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

编辑:即使命名空间的构造方式如“ CompanyName.Project1 ”,“ CompanyName.Project2 ”,internal关键字也会有效吗?他们会见面吗?

2 个答案:

答案 0 :(得分:2)

您无需将它们组合在一起,只需要friend assembly

  

在开发类库时,库的附加内容包含在单独的程序集中,但需要访问标记为Friend(Visual Basic)或internal(C#)的现有程序集中的成员。
  ...
  只有您明确指定为朋友的程序集才能访问Friend(Visual Basic)或内部(C#)类型和成员。

InternalsVisibleTo属性:

  function prepareList() {
    $('#expList').on('click', 'li:has(ul)', function(event) {
        if (this == event.target) {
            $(this).toggleClass('expanded').children('ul').toggle('medium');
            return false;
        }
    });
    $('#expList li:has(ul)').addClass('collapsed').children('ul').hide();
  };

有助于将其锁定,因此只有指定的程序集才能访问[assembly: InternalsVisibleTo("AssemblyB")] 项。

(回答你的编辑:这是在程序集级别指定的,命名空间是什么并不重要。)

答案 1 :(得分:1)

使用internal

参见下面的示例

public class MyPublicClass
{

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

internal class MyInternalClass
{

    public void DoSomething()
    {
    }
}

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

MyInternalClass将不可见。