2009-10-02 5 views
5

Я создаю инструмент в управляемом коде (в основном, C++/CLI) в двух версиях, версии «обычного пользователя» и версии «pro»..NET-эквивалент статических библиотек?

Тот факт, что код ядра идентичен между двумя версиями, вызвал у меня небольшую проблему, так как я хочу упаковать полученный инструмент как единую сборку (DLL), и я не хочу включать .cpp файлы для общего кода в проектах двух версий инструментов. Я предпочел бы иметь проект для общего кода и проекта для каждой версии инструмента, и каждая версия проекта инструментов зависит от общего кода и связывает его по желанию.

В неуправляемом C++ я бы сделал это, разместив общий код в статической библиотеке и связав обе версии этого инструмента с ним. Кажется, я не могу заставить это работать в C++/CLI. Кажется, что я вынужден создать общий код в сборке DLL, и это приводит к большему количеству DLL, чем хотелось бы.

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

Я, вероятно, что-то не так, но я попытался понять, как это сделать, используя netmodules и все такое, и я просто не мог заставить его работать. В конце концов, единственным способом, с помощью которого я работал, было рассказать компоновщику, чтобы связать продукты сборки общей сборки кода, а не результаты, которые работают, но немного взламывают IMHO.

В любом случае, есть ли у кого-нибудь предложения по поводу того, как мне СЛЕДУЕТ решить эту проблему?

Отредактировано: Я предполагаю, что я хотел бы упомянуть тот факт, что узлы, сгенерированные не являются 100% управляемым кодом, они содержат смесь управляемого и неуправляемого код, как есть, вероятно, довольно часто со сборками производятся с C++/CLI ...

+0

Я очень рекомендую избавиться от идеи, что вам нужно упаковать ее в одну DLL. –

ответ

6

Если вы недовольны всеми DLL, загрузите ILMerge. Я использую это, чтобы объединить несколько DLL в простой в использовании .EXE для моих клиентов.

+0

Спасибо, я посмотрю. –

+0

Я, наверное, должен был упомянуть, что одна из сборок не является 100% управляемым кодом ... ILMerge не работает с ней :( –

+0

Paul, я принял этот ответ, поскольку это лучший ответ для ситуаций, когда есть нет неуправляемого кода в сборках.Я все еще ищу решение, которое работает со смешанными сборками.Я еще не исследовал «объекты модулей». –

0

Это недостаток процесса компиляции .Net, вы не можете иметь такие вещи, как статические библиотеки и файлы заголовков, которые удерживают их вместе, все хранится в одном большом DLL-файле и является единственным способом обмена информацией заключается в том, чтобы либо построить общую dll и ссылаться на нее из других сборок, либо дублировать код в каждой DLL (возможно, путем копирования/связывания файлов .cs между проектами).

Обратите внимание, что второй способ будет объявлять разные типы, хотя они имеют одинаковое имя. Это укусит вас в задницу такими вещами, как удаленное перемещение (или все, что требует отбрасывания на определенные общие интерфейсы между процессами).

+0

Можете ли вы объяснить немного больше о своем втором абзаце. Вы говорите, что если у меня есть ссылка на компоновку сборки сборки сборки сборки в окончательную сборку, то у меня будут проблемы? –

+0

Да, поэтому, когда вы делаете удаленный доступ, общие интерфейсы хранятся в файле 3-й DLL, на который ссылаются как сервер, так и клиентские программы. Наличие типа с тем же именем и структурой в двух разных сборках создает в целом 2 разных типа, в отличие от неуправляемых библиотек C++, которые не содержат метаданных и поэтому видят одинаковый структурированный тип в обеих версиях программы. – Blindy

0

Remotesoft Salamander свяжет вас. Это основной компилятор и компоновщик.

+0

Спасибо, выглядит немного дорогим для того, что я хочу, но я возьму посмотрите, как это может также решить мои требования обфускации ... –

+0

Снова не обрабатывает смешанные управляемые/неуправляемые сборки ... –

2

Как сказал ILmerge - это один из способов, лично, если ваш комплект некоторых exe с большим количеством dll's пользуется Netz.

+0

Спасибо, Нильс, я попробую! –

+0

1) Похоже, что для вывода нужен exe (мое приложение упаковано как dll). 2) Не обрабатывает смешанные управляемые/неуправляемые сборки C++/CLI. –

+0

1) Да - он не может обрабатывать упаковку «dll-only». 2) У вас был взгляд на «mkbundle» (см. Другой ответ) - cygwin может быть довольно странным предварительным условием, но IMO mkbundle обрабатывает управляемые/неуправляемые миксы - НО: Я так и не попробовал. (всегда желательно, жестко) – Nils

0

При использовании моно (или cygwin является опцией) mkbundle также может быть допустимым выбором.

1

Вы можете использовать modules. Вы можете связать их с сборкой, используя компоновщик компоновки, al.exe.

+0

Я пробовал это и не мог заставить его работать, знаете ли вы о нетривиальном примере того, как его настроить? В идеале, чтобы код можно было построить с помощью VS2008, а модули были объединены с шагом пользовательской сборки? –

+0

Нет, я не знаю. Модули довольно эзотерические. –

1

Если я понимаю это правильно, у вас есть решение, которое содержит два проекта. Один проект для «обычного» пользователя и один проект для пользователя «pro».Visual Studio позволяет вам добавить ссылку на другой источник из другого проекта. Если ваша «про» версия имеет реальный файл основного кода, а в вашей «нормальной» версии вы добавляете существующий -> найдите файл в проекте «pro» и нажмите стрелку вниз кнопкой «Добавить» и выберите «Добавить как ссылку» ». Теперь у вас есть один файл, который буквально одинаково между двумя проектами.

+0

Эрик. Это может сработать, хотя это немного боль с точки зрения масштабируемости (т. Е. Не просто добавить другой проект, который зависит от 90% кода в проекте 1). Я отдам его. –

+0

Правда, но я бы предположил, что проблема масштабируемости будет только проблемой между различными версиями normal, pro и etc. Если вы собираетесь писать код против своей собственной DLL, я бы предположил, что вы собираетесь использовать про версию :). –

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