Варианты использования для использования сетевых модулей при компиляции сборок.NET?
Меня интересуют варианты использования сетевых модулей в.NET. В частности, я искал более эффективные способы разбивки решений в.NET, но не так много сборок для развертывания. Сетевые модули - очень интересная идея, но они, кажется, нарушают отладку и не поддерживаются в Visual Studio изначально (хотя они предназначены для MSBuild). Я предпочел бы положиться на что-то родное для.NET, так что ILMerge, хотя интересно не то, что я действительно хочу.
Для некоторых моих собственных проектов я также начинаю использовать FAKE, что позволяет выполнять некоторые интересные этапы сборки, такие как разделение тестовых файлов. Другими словами, написание пользовательских шагов компиляции не является проблемой.
3 ответа
Отсутствие ответов заставляет меня думать, что другие варианты, отмеченные в комментариях и ответах, обычно считаются более подходящими, чем сетевые модули. Таким образом, я предполагаю, что это означает, что никто на самом деле не использует и не знает ни одного хорошего использования сетевых модулей.
Сетевой модуль сам по себе практически бесполезен: его типы и код не могут быть загружены и выполнены средой выполнения. Вы можете загружать типы и выполнять код только из сборок, поэтому вполне вероятно, что в конечном итоге вы объедините несколько сетевых модулей в (многофайловую) сборку. Итак, давайте посмотрим на преимущества этих.
Джеффри Рихтер упоминает три использования многофайловых сборок в своей книге CLR через C# (стр. 44), два из которых являются результатом использования сетевых модулей:
"Вы можете разделить ваши типы по отдельным файлам, что позволяет постепенно загружать файлы […]. Разделение типов на отдельные файлы также позволяет частично или по частям упаковывать и развертывать приложения, которые вы приобретаете и устанавливаете".
По крайней мере, реализация Microsoft CLI (.NET), похоже, загружает многофайловую сборку постепенно, а не полностью с самого начала. Модуль из сборки загружается с диска (или из сети?) Только тогда, когда в нем действительно необходим тип внутри.
"Вы можете создавать сборки, состоящие из типов, реализованных на разных языках программирования. […]"
Я не уверен, что это на самом деле приносит большую пользу в реальных сценариях, (а) потому что Visual Studio не поддерживает ссылки на проекты на сетевые модули, и (б) потому что вы можете получить такое же преимущество со сборками.
Существует одно заметное различие между подходом с несколькими сборками и несколькими файлами: одна сборка по умолчанию не может получить доступ к типам других сборок, которые имеют
internal
/Friend
(т.е. сборка) видимость. Если вместо этого вы компилировали модули, а затем связывали их в одну многофайловую сборку, модуль, скомпилированный из C#, мог получить доступ кinternal
типы модулей, скомпилированных с VB.NET (и наоборот).Вы найдете краткую демонстрацию этого ниже.
CsharpClass.cs:
internal class CsharpClass { }
VbClass.vb:
Friend Class VbClass : End Class
Program.cs:
public static class Program { public static void Main() { var vbClass = new VbClass(); var csharpClass = new CsharpClass(); } }
Скрипт сборки для сетевых модулей:
csc.exe /t:module /out:CsharpClass.netmodule CsharpClass.cs vbc.exe /t:module /out:VbClass.netmodule VbClass.vb csc.exe /t:exe /out:Program.exe /addmodule:CsharpClass.netmodule /addmodule:VbClass.netmodule Program.cs
Эта сборка будет работать и выполняться без ошибок.
Обратите внимание, что в этом нет ничего волшебного
.netmodule
расширение файла; это всего лишь соглашение, но выходной файл - это обычная.NET DLL.Скрипт сборки для сборок:
csc.exe /t:library /out:CsharpClass.dll CsharpClass.cs vbc.exe /t:library /out:VbClass.dll VbClass.vb csc.exe /t:exe /out:Program.exe /r:CsharpClass.dll /r:VbClass.dll Program.cs
Эта сборка не удастся, потому что:
Program.cs(5,27): error CS0122: 'VbClass' is inaccessible due to its protection level Program.cs(5,23): error CS0143: The type 'VbClass' has no constructors defined Program.cs(6,31): error CS0122: 'CsharpClass' is inaccessible due to its protection level Program.cs(6,27): error CS0143: The type 'CsharpClass' has no constructors defined
Можете ли вы использовать технику встраивания сборки Джеффри Рихтера? Я сам не пробовал, но выглядит многообещающе.