Варианты использования для использования сетевых модулей при компиляции сборок .NET? - PullRequest
4 голосов
/ 02 августа 2010

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

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

Ответы [ 3 ]

4 голосов
/ 22 августа 2012

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

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

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

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

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

    Я не уверен, что это на самом деле добавляет большую ценность в реальных сценариях, (a) потому что Visual Studio нене поддерживает ссылки проекта на сетевые модули и (b) потому что вы можете получить то же преимущество со сборками.

    Существует одно заметное различие между подходом с несколькими сборками и сборкой из нескольких файлов: одна сборка не может получить доступ по умолчаниютипы других сборок с видимостью 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
    
1 голос
/ 13 марта 2011

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

0 голосов
/ 14 марта 2011

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

...