Хостинг CLR и программное обеспечение app.config? - PullRequest
2 голосов
/ 28 марта 2012

У меня есть собственная сторонняя игра, которая позволяет мне писать собственные расширения для нее, экспортируя определенную функцию в собственную DLL.Я использовал это для размещения CLR, используя сгенерированный компилятором C ++ / CLI код хостинга, что позволило мне вызывать код C # из игры.Это отлично работает, и это очень элегантное решение.

Как только CLR загружен игрой, он ищет game.exe.config в папке исполняемого файла игры для получения дополнительной информации о сборке .NET:

<?xml version="1.0"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="@Arma2NET"/>
    </assemblyBinding>
  </runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>

Этот произвольный файл конфигурации нарушает структуру моей папки;Я бы хотел, чтобы мой проект содержался в папке @Arma2NET и не имел случайных файлов конфигурации в папке с игрой.В настоящее время из-за требований к папке игры невозможно, чтобы файлы проекта находились в той же папке, что и собственная DLL-библиотека хостинга CLR.

Существует ли способ программно предоставить CLR эту конфигурацию из собственного кодаон начинается, если не считать написания всего кода CLR-хостинга сам?

Ответы [ 2 ]

1 голос
/ 27 апреля 2012

В итоге я использовал событие AssemblyResolve, чтобы сообщить .NET, где найти остальные мои сборки:

    Assembly^ ResolveAssembly(Object ^sender, ResolveEventArgs ^e)
    {
        String ^directory = Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location);
        AssemblyName ^assemblyName = gcnew AssemblyName(e->Name);
        for each (String ^extension in gcnew array<String^> { ".dll", ".exe" })
        {
            String ^fileName = Path::Combine(directory, assemblyName->Name + extension);
            try
            {
                return Assembly::LoadFile(fileName);
            }
            catch (...)
            {
            }
        }
        return nullptr;
    }
0 голосов
/ 28 марта 2012

Как насчет того, чтобы изменить app.config в действии сборки проекта библиотеки на «Встроенный ресурс», а затем использовать что-то вроде ConfigurationManager.OpenMappedExeConfiguration, чтобы прочитать его.

...