Настройка библиотеки .NET из неуправляемого C ++ - PullRequest
0 голосов
/ 20 января 2011

У меня есть библиотека C # .NET под названием Foo, которая создает файл Foo.dll. Это также настраивается через файл .config, который выглядит следующим образом:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="Foo.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Foo.Properties.Settings>
      <setting name="Server" serializeAs="String">
        <value>localhost</value>
      </setting>
    </Foo.Properties.Settings>
  </applicationSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

То, что я хочу сделать, это вызвать функции в этой библиотеке .NET из неуправляемой программы C ++ под названием Bar и иметь возможность изменять свою конфигурацию из неуправляемого приложения C ++. Я смог вызвать функции Foo из Bar, установив классы / атрибуты интерфейса ComVisible в true в Foo. Тем не менее, Я не смог изменить значения файла .config из неуправляемого приложения C ++ - Сервер всегда "localhost" .

Возможно ли то, что я пытаюсь сделать - настройка библиотеки .NET из неуправляемого C ++ - даже возможно?

Ответы [ 2 ]

4 голосов
/ 24 января 2011

Ну, это возможно, но не маленький объем работы. Как правило, проще создать домен приложения и настроить конфигурацию из управляемого мира, а затем создать небольшой «громоздкий» слой в управляемом коде, чтобы обернуть его для неуправляемых клиентов. Но поскольку это не то, о чем вы просили, вот как вы можете достичь своей цели:

Сначала вам нужно будет импортировать mscorelib:

#include <mscoree.h>
#import <mscorlib.tlb> raw_interfaces_only no_smart_pointers high_property_prefixes("_get","_put","_putref")

Затем привязать к среде выполнения:

ICorRuntimeHost runtimeHost;
hr = CorBindToRuntimeEx(
    NULL,   //Retrieve latest version by default
    L"wks", //Request a WorkStation build of the CLR
    STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN | STARTUP_CONCURRENT_GC, 
    CLSID_CorRuntimeHost,
    IID_ICorRuntimeHost,
    (void**)&runtimeHost
);

Теперь запустите CLR и создайте экземпляр AppDomainSetup.

hr = runtimeHost->Start();
IAppDomainSetup pSetup;
hr = runtimeHost->CreateDomainSetup(&pSetup);

Теперь введите соответствующую информацию о настройке:

hr = pSetup->put_ApplicationBase(_bstr_t(thisFile));
hr = pSetup->put_ConfigurationFile(_bstr_t(configFile));

Окончательно создайте домен:

hr = __gRuntimeHost->CreateDomainEx(L"ISAPI.Net", pSetup, NULL, &pDomain);

Теперь вы можете дополнительно создать экземпляр объекта и вызвать методы:

hr = pDomain->CreateInstanceFrom(_bstr_t(assemblyFile), _bstr_t("Namespace.ClassName"), &pObjectHandle);
VARIANT vtUnwrapped;
hr = spObjectHandle->Unwrap(&vtUnwrapped);
IDispatch pDisp = vtUnwrapped.pdispVal;
DISPID dispid;
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pDisp->GetIDsOfNames (
        IID_NULL, 
        szMemberName,
        1,
        LOCALE_SYSTEM_DEFAULT,
        &dispid
    );

hr = pDisp->Invoke (
          dispid,
          IID_NULL,
          LOCALE_SYSTEM_DEFAULT,
          DISPATCH_METHOD,
          &dispparamsNoArgs,
          NULL,
          NULL,
          NULL
      );

Очевидно, что приведенные выше фрагменты кода являются неполными; однако, если ваш адепт достаточно в C ++ COM, вышеприведенное должно предоставить вам достаточно информации, чтобы разобраться с этим. Вы должны отметить, что это «старые» (1.x) хостинговые интерфейсы, которые, как я могу подтвердить, продолжают работать через 3.5, я понятия не имею, как / если они работают на 4.0. Начиная с .Net 2.0 были представлены новые интерфейсы хостинга . Мне никогда не требовалось ничего, кроме версий 1.x, поэтому я никогда не удосужился обновить какой-либо хостинг-код.

см. Также: Обзор хостинга

0 голосов
/ 21 января 2011

. Конфигурационная система .Net загружает .config файлы для EXE-файлов; В DLL нет конфигурационных файлов.

Вам нужно найти другой подход.

РЕДАКТИРОВАНИЕ : Вы также можете создать файл конфигурации в форме HostApp.exe.config, где HostApp - полный путь к вашему собственному EXE.

...