2013-02-12 1 views
1

Если вам нужно было отображать функциональность извне как DLL, но только подмножество функциональности (что означает, что вы не можете предоставить базовую DLL, поскольку она будет раскрывать все), как это лучше всего сделать?Предоставлять ограниченный API извне как DLL

В настоящий момент я не вижу никакого способа сделать это, что не предполагает воссоздания частей основной библиотеки в отдельной DLL.

ответ

0

Несомненно, просто создав новый проект, который обертывает основную DLL, подвергая только методы, которые вы хотите открыть, каждый из которых действует более или менее как «сквозной» метод «Тот же» в ядре?

Так что, если вы ядро ​​называется Core :) может иметь:

public int Foo() 
{ 
    //blah 
} 

public int Bar() 
{ 
    /blah 
} 

, и если вы хотите только выставить Foo, то вы создаете новый проект, который ссылается Core, и выглядит следующим образом:

using Core; 

public class MyApi 
{ 
    private Core _coreInstance.... //some way of reaching Core, in other words 

    public int Foo() 
    { 
     return _coreInstance.Foo(); 
    } 
} 

преимущество создания отдельного узла является то, что вы затем обрабатывать свою основную функциональность как одно понятие, и воздействие его публично (к ар суставное назначение или аудитория) как другое. Вы можете очень хорошо разоблачить «публично» разную функциональность на более позднем этапе, , но другой аудитории - теперь у вас есть 2 разных общедоступных API: поэтому любое понятие о том, что было «общедоступным» в вашей основной сборке, теперь потенциально неоднозначный.

+0

Для этого вам потребуется включить базовую DLL в файлы, через которые вы проходите, или .Net будет генерировать исключение, не найденное. – David

+0

, а ваша озабоченность больше связана с внешним распространением вашей основной DLL, которая затем может быть использована напрямую? – baldric

+0

Да, в основном нам нужно предоставить подмножество функциональности извне, не подвергая никаким основным механизмам. Даже если бы мы могли каким-то образом «слить» ядро ​​dll в оболочку, он все равно может быть декомпилирован. – David

2

Вы можете использовать internal вместе с другими сборками. Ваш API может быть другом основной библиотеки, предоставляющей доступ к внутренним членам.

Смотрите здесь для более подробной информации - http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.90).aspx

Это позволит вам сохранить ваши основные объекты усвоенные позволяя при этом доступ API к ним.

Обратите внимание, что вам будет необходимо предоставить основную библиотеку. Нет никакого способа обойти это, если вы не используете что-то для объединения сборников .NET или компилируете код в свою библиотеку API.

Однако я думаю, что это плохая идея, и вы должны держать такие сущности отдельно. Я не понимаю, почему существует проблема, связанная с доставкой более одной библиотеки.

FYI - ILMerge позволит вам объединить сборки .NET, вы можете получить его здесь - http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

+0

Требуется ли для этого сборка исходной основной библиотеки? – David

+0

Проблема больше, если кто-то взял основную dll и декомпилировал ее. Полагаю, что это просто должна быть копия той функциональности, которую мы предоставляем. – David

+0

Они могут взять вашу окончательную библиотеку и декомпилировать это тоже. Итак, это спорный вопрос :) – Lloyd

0

Я думаю, что это зависит от целей, вы будете следовать в сокрытии основных библиотек.

Если вы не хотите, чтобы ваши клиенты вызывали код, например, если это может нарушить сценарии использования ваших библиотек или может привести к нежелательному поведению или что-то еще, чтобы предотвратить ЗВОНОК кода, вы можете сделать защищенный классы внутри и использовать InternalsVisibleToAttribute для включения сборки Facade. Я бы даже использовать еще одну конфигурацию сборки, если я по-прежнему необходим базовые классы, чтобы быть видимыми в моих приложениях:

#if PUBLIC_BUILD 
    internal 
#else 
    public 
#endif 
    class ProtectedCoreClass 

Но, конечно, если у вас есть слишком много классов, некоторый сценарий должен быть готов изменить существующие классы и Шаблон нового класса Visual Studio должен быть изменен.

Но еще один случай - если вы хотите, чтобы ваш код не был ОБРАТНЫ вашими клиентами, чтобы скрыть некоторые супер уникальные алгоритмы или что-то в этом роде. Затем вы должны заглянуть в какой-нибудь программный обфускатор. Но нет абсолютно никакого способа гарантировать, что код будет декомпилирован и проанализирован на 100%. Это касается только цены на крекеры или конкурентов за это.

Но если HIDING исходный код по-прежнему чрезвычайно важен, вероятно, вы должны просто разместить свой код на своих серверах (чтобы убедиться, что код физически недоступен) или в облаке, а также предоставить WCF или веб-службу, сборка вызовет.

Смежные вопросы