Как встроить сборку-сателлит в EXE-файл

Язык определения интерфейсов (IDL) используется для установки связи между клиентами и серверами в вызовах удаленной процедуры (RPC). Было много изменений этого, таких как RPC Sun, RPC ONC, RPC DCE и так далее.

В основном, Вы используете IDL для определения интерфейса между клиентом и сервером так, чтобы механизм RPC мог создать тупики кода, требуемые вызывать функции по сети.

RPC должен создать интерфейсные функции для клиента и сервера, с помощью информации о IDL. Это очень похоже на прототипа функции в C, но конечный результат немного отличается, таков как:

+----------------+
| Client         |
|  +----------+  |  +---------------+
|  |   main   |  |  | Server        |
|  |----------|  |  |  +----------+ |
|  | stub_cli |------->| stub_svr | |
|  +----------+  |  |  |----------| |
+----------------+  |  | function | |
                    |  +----------+ |
                    +---------------+

В этом примере, вместо того, чтобы звонить function в ту же программу, main вызовы клиентская интерфейсная функция (с тем же прототипом как function), который ответственен за упаковку информации и получения его через провод к другому процессу. Это может быть той же машиной или другой машиной, она действительно не имеет значения - одно из преимуществ RPC должно быть в состоянии переместить серверы по желанию.

В сервере, существует процесс 'слушателя', который получит ту информацию и передаст ее серверу. Тупик сервера получает информацию, распаковывает ее и передает ее реальной функции.

реальная функция тогда делает то, что она должна и возвращается к тупику сервера, который может упаковать информацию о возврате (и код возврата и любой [out] или [in,out] переменные) и пасовать назад ее к клиентскому тупику.

клиентский тупик тогда распаковывает это и пасует назад его к main.

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

фактический IDL может быть похожим:

[uuid(f9f6be21-fd32-5577-8f2d-0800132bd567),
    version(0),
    endpoint("ncadg_ip_udp:[1234]", "dds:[19]")]
interface function_iface {
    [idempotent] void function(
        [in] int handle,
        [out] int *status
    );
}

Все это наверху является в основном сетевой информацией, суть его в интерфейсном разделе, где прототипы показывают. Это позволяет компилятору IDL создавать x функции тупикового и X-сервера для компиляции и соединения с Вашим кодом клиента и сервера для получения работы RPC.

Microsoft действительно использует IDL (я думаю, что у них есть компилятор MIDL) для материала COM. Я также использовал сторонние продукты с операционными системами MS, и DCE и RPC ONC.

16
задан Peter Mortensen 1 August 2010 в 22:45
поделиться

3 ответа

Другой вариант - встроить другие сборки как EmbededResource. Затем обработайте домены приложений AssemblyResolve, отсюда вы можете прочитать сборку из ресурса и загрузить ее в среду выполнения. Примерно так:

public class HookResolver
{
    Dictionary<string, Assembly> _loaded;

    public HookResolver()
    {
        _loaded = new Dictionary<string, Assembly>(StringComparer.OrdinalIgnoreCase);
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    }

    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string name = args.Name.Split(',')[0];
        Assembly asm;
        lock (_loaded)
        {
            if (!_loaded.TryGetValue(name, out asm))
            {
                using (Stream io = this.GetType().Assembly.GetManifestResourceStream(name))
                {
                    byte[] bytes = new BinaryReader(io).ReadBytes((int)io.Length);
                    asm = Assembly.Load(bytes);
                    _loaded.Add(name, asm);
                }
            }
        }
        return asm;
    }
}
4
ответ дан 30 November 2019 в 21:46
поделиться

The short answer is yes, there is a program called Assembly Linker (AL.exe) that will embed assemblies in this way. Its main use case is localization, sounds like that is what you need it for too. If so, it should be straightforward.

Eg:

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll

or

al.exe /culture:en-US /out:bin\Debug\en-US\HelloWorld.resources.dll /embed:Resources\MyResources.en-US.resources,HelloWorld.Resources.MyResources.en-US.resources /template:bin\Debug\HelloWorld.exe

This is an example walkthrough of it MSDN with the above examples and more. Also you may want to read this blog post which explains its usage a bit further.

10
ответ дан 30 November 2019 в 21:46
поделиться

ILMerge создаст единственный исполняемый файл для вашего приложения. Вы можете загрузить его с сайта Microsoft. Он объединяет сборки вместе и может интернализовать их, чтобы объединенные классы были установлены как внутренние. Это то, что я использовал для создания отдельных файловых релизов несколько раз. Его довольно легко интегрировать в процесс сборки.

3
ответ дан 30 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: