Варианты использования для использования сетевых модулей при компиляции сборок.NET?

Меня интересуют варианты использования сетевых модулей в.NET. В частности, я искал более эффективные способы разбивки решений в.NET, но не так много сборок для развертывания. Сетевые модули - очень интересная идея, но они, кажется, нарушают отладку и не поддерживаются в Visual Studio изначально (хотя они предназначены для MSBuild). Я предпочел бы положиться на что-то родное для.NET, так что ILMerge, хотя интересно не то, что я действительно хочу.

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

3 ответа

Решение

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

Сетевой модуль сам по себе практически бесполезен: его типы и код не могут быть загружены и выполнены средой выполнения. Вы можете загружать типы и выполнять код только из сборок, поэтому вполне вероятно, что в конечном итоге вы объедините несколько сетевых модулей в (многофайловую) сборку. Итак, давайте посмотрим на преимущества этих.

Джеффри Рихтер упоминает три использования многофайловых сборок в своей книге CLR через C# (стр. 44), два из которых являются результатом использования сетевых модулей:

  1. "Вы можете разделить ваши типы по отдельным файлам, что позволяет постепенно загружать файлы […]. Разделение типов на отдельные файлы также позволяет частично или по частям упаковывать и развертывать приложения, которые вы приобретаете и устанавливаете".

    По крайней мере, реализация Microsoft CLI (.NET), похоже, загружает многофайловую сборку постепенно, а не полностью с самого начала. Модуль из сборки загружается с диска (или из сети?) Только тогда, когда в нем действительно необходим тип внутри.

  2. "Вы можете создавать сборки, состоящие из типов, реализованных на разных языках программирования. […]"

    Я не уверен, что это на самом деле приносит большую пользу в реальных сценариях, (а) потому что 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
    

Можете ли вы использовать технику встраивания сборки Джеффри Рихтера? Я сам не пробовал, но выглядит многообещающе.

Другие вопросы по тегам