C# 访问dll方法

C# 访问dll方法,c#,dll,encapsulation,C#,Dll,Encapsulation,我为我的客户准备了一些C#dll,以实现一些功能。 问题是我也使用相同的dll。 我怎样才能使一些方法对他可用,而所有方法对我可用。 谢谢,您可以使用like#define从同一代码库编译两个版本的库 然后将一个版本发送给您的客户,另一个版本留给您自己。您可以使用like#define从相同的代码库编译库的两个版本 然后将一个版本发送给您的客户,另一个版本留给您自己。使用共享代码库 只需编译两个项目。一个包含您提供给客户的DLL的源代码,另一个包含您为自己保留的所有源代码 优点:他们看不到任何


我为我的客户准备了一些C#dll,以实现一些功能。
问题是我也使用相同的dll。
我怎样才能使一些方法对他可用,而所有方法对我可用。
谢谢,

您可以使用like
#define
从同一代码库编译两个版本的库

然后将一个版本发送给您的客户,另一个版本留给您自己。

您可以使用like
#define
从相同的代码库编译库的两个版本


然后将一个版本发送给您的客户,另一个版本留给您自己。

使用共享代码库

只需编译两个项目。一个包含您提供给客户的DLL的源代码,另一个包含您为自己保留的所有源代码

  • 优点:他们看不到任何你想为自己保留的源代码,你也不需要设置任何特殊的托管——只需向他们发送DLL即可
  • 缺点:你必须做额外的工作来设置你的代码库,使之能够使用fork。进行这种重构可能是一项巨大的开发投资
提供web服务

为客户提供web服务,以访问允许其访问的代码

  • 优点:他们根本看不到任何来源
  • 缺点:根据代码的不同,可能需要做很多工作(使安全性达到最低要求),也可能不可能(使性能达到最低要求)。或者这可能很容易,因为这些可能不是什么大问题。您还必须设置专用的主机才能使其工作
使用共享DLL中的
InternalsVisibleTo
属性

  • 标记您要使用的
    内部方法
  • 对使用DLL的您自己的代码进行代码签名
  • 对共享DLL进行代码签名
  • [程序集:InternalsVisibleTo]
    添加到共享DLL
  • 见:

    • 优点:这是一个非常容易编写代码的解决方案
    • 缺点:客户端可以通过Reflector访问完整的源代码。您可以通过混淆您的代码,或者建立一个合法禁止他们对您的代码进行反向工程的许可协议来缓解这一问题

    使用共享代码库

    只需编译两个项目。一个包含您提供给客户的DLL的源代码,另一个包含您为自己保留的所有源代码

    • 优点:他们看不到任何你想为自己保留的源代码,你也不需要设置任何特殊的托管——只需向他们发送DLL即可
    • 缺点:你必须做额外的工作来设置你的代码库,使之能够使用fork。进行这种重构可能是一项巨大的开发投资
    提供web服务

    为客户提供web服务,以访问允许其访问的代码

    • 优点:他们根本看不到任何来源
    • 缺点:根据代码的不同,可能需要做很多工作(使安全性达到最低要求),也可能不可能(使性能达到最低要求)。或者这可能很容易,因为这些可能不是什么大问题。您还必须设置专用的主机才能使其工作
    使用共享DLL中的
    InternalsVisibleTo
    属性

  • 标记您要使用的
    内部方法
  • 对使用DLL的您自己的代码进行代码签名
  • 对共享DLL进行代码签名
  • [程序集:InternalsVisibleTo]
    添加到共享DLL
  • 见:

    • 优点:这是一个非常容易编写代码的解决方案
    • 缺点:客户端可以通过Reflector访问完整的源代码。您可以通过混淆您的代码,或者建立一个合法禁止他们对您的代码进行反向工程的许可协议来缓解这一问题

    您必须编译两个版本的程序集。您分发给客户的版本需要完全排除您不希望他们访问的方法,否则无论您如何“隐藏”它们,都可以通过反射访问它们


    (假设您不希望对程序集进行签名)

    您必须编译两个版本的程序集。您分发给客户的版本需要完全排除您不希望他们访问的方法,否则无论您如何“隐藏”它们,都可以通过反射访问它们


    (假设您不希望程序集被签署)

    您不必做任何事情:)企业通常可以通过许可协议来解决这个问题。当然,但我遇到过这样的情况,即使让客户只看到我们的代码也太多了。你不必做任何事情:)企业通常可以通过许可协议来解决这个问题。当然,但我也遇到过这样的情况,即使让客户只看到我们的代码也太多了。答案很好。我选择
    InternalsVisibleTo
    ,因为我认为这是最简单的一个。谢谢你的回答。我选择
    InternalsVisibleTo
    ,因为我认为这是最简单的一个。谢谢