C# 在项目之间共享C代码而不公开类

C# 在项目之间共享C代码而不公开类,c#,.net,code-sharing,C#,.net,Code Sharing,我有一个C库,它有很多内部功能,只公开了一些公共类和接口。我想在几个项目之间共享这段代码,每个项目可能需要用子类扩展内部类 我不喜欢为了创建公共库而公开所有这些类的想法。我认为这暴露了他们太多,很容易反编译和破坏设计 是创建源代码副本并在项目之间保持这些文件同步的唯一实际选项吗?或者,是否有某种方法可以共享代码,并且仍然为每个项目获得一个库,只公开少数预期的公共接口和类 我正在使用VisualStudio2010 更新 感谢您对反编译和私有访问的澄清。我想我可以考虑把混淆器应用到几个输入库上,希

我有一个C库,它有很多内部功能,只公开了一些公共类和接口。我想在几个项目之间共享这段代码,每个项目可能需要用子类扩展内部类

我不喜欢为了创建公共库而公开所有这些类的想法。我认为这暴露了他们太多,很容易反编译和破坏设计

是创建源代码副本并在项目之间保持这些文件同步的唯一实际选项吗?或者,是否有某种方法可以共享代码,并且仍然为每个项目获得一个库,只公开少数预期的公共接口和类

我正在使用VisualStudio2010

更新

感谢您对反编译和私有访问的澄清。我想我可以考虑把混淆器应用到几个输入库上,希望能混淆他们的公共连接。


从设计的角度来看,答案似乎是使用好友程序集。

您可能想看看如何使用好友程序集:


您正在查找好友程序集:
创建一个新项目。文件>添加>现有。选择现有的代码文件。点击打开按钮上的下拉菜单并选择链接


将类设置为内部类与公共类绝对不会影响其反编译能力。

您可以在程序集上使用

我认为这暴露了它们太多,不容易反编译

这样一来,您会大吃一惊,因为即使是程序集中的私有类也可以进行简单的反编译并用于创建公共实现


破坏设计是另一个问题。如果您想从单独的项目中使用此代码,那么将其公开正是正确的做法。如果你不想把它们公之于众,那就考虑一下这个项目真正想向外界公开的界面,它仍然可以满足你的需要。。。构建该api并将其公开。

您最后一句话“内部vs.公共”并不完全正确。大多数模糊处理程序会主动重命名/模糊内部类/方法,而不会重命名公共类。这种解决方案有一些问题是的,但我认为它们没有在许多其他帖子中提到的使用好友程序集所面临的问题那么烦人。@b1naryj,这个解决方案如何摆脱他的名称空间约定?如果他所做的只是链接所需的文件,保存所有内容,只要他不持有代码实际驻留的项目的引用,那么这是一个比朋友程序集好得多的解决方案:@b1naryj如果有任何东西可以创建一个与所需名称空间相似的完整目录/子目录树的话。我认为我们对整个目录结构解决方案过于热心了。MSFT的神也做了同样的事情,看看System.Web dll,它有Microsoft.Runtime.Hosting和System.Configuration,而不仅仅是System.Web….:这种方法的另一个优点是,我的应用程序不会加载整个程序集,因为我需要其中的一个类,并且我可以对同一个文件进行编辑,而不必重新生成其他项目,除非在其他地方需要更改。这样做几乎不会对反编译提供保护。一些纯粹主义者会说,在做你想做的事情时,你在扩展OOP原则——这是一种泄漏的封装。访问修饰符对反编译没有影响。您可以使用任何reflector应用程序从DLL中提取C代码。不要在这方面浪费你的时间。这是一个公平的观点,在这种情况下,使用一个模糊器可能更有意义,它能够将多个输入库,甚至它们的公共连接混淆在一起,是吗?问题是有两个公共用户:我自己,当我在做其他项目时,我认为这里的关键是OP对限定符easy的使用。根据我在Boo的帖子上的评论,任何著名的混淆器都会损坏/重命名内部和私有类/方法,因为它们不会对公共类/方法执行相同的操作。这是否意味着一个模糊的程序集不能被反编译-不-但这确实意味着通过重命名/损坏的程序集更困难。太简单了,是的。你能在这儿看看吗
[assembly:InternalsVisibleTo("someassembly")]