Проекты Visual Studio C #: как разместить условные ссылки в .csproj? - PullRequest
3 голосов
/ 24 октября 2010

Я работаю над проектом с открытым исходным кодом (Logbus-ng), и мне нужно реализовать веб-сервис, созданный консольным приложением, таким образом, чтобы он работал и в Windows и Mono.

В настоящее время благодаря учебнику от MSDN Magazine мне удалось сделать это в Windows.Консольное приложение может порождать свой собственный веб-сервер и фактически открывать интерфейс веб-службы для внешнего.Проблема в том, что это не работает в Mono, в основном из-за ошибки Mono.

Общаясь с разработчиками Mono, они предложили мне использовать сборку Mono.XSP для включения конвейера ASP.NET в консольные приложения., поэтому я думаю, что я буду использовать различные реализации активатора веб-службы в зависимости от конфигурации.

Теперь мой вопрос : поскольку Mono.XSP доступен вGAC во всех дистрибутивах Mono (т.е. при использовании xbuild под Linux), но недоступен в Windows, если только кто-то не установит его в GAC, и я не хочу, чтобы поставлял Mono.XSP с моим программным обеспечением, нивынудить кого-либо установить Mono, если он не нужен (т. е. если выполняется компиляция под Windows), могу ли я установить ссылку на сборку Mono.XSP в GAC, которая включена, только если включен флаг компиляции MONO?Когда этот флаг включен, мой код, очевидно, будет ссылаться на Mono.XSP вместо HttpListenLibrary, описанного в учебном пособии, указанном выше, и ссылка будет правильно использоваться компилятором.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 24 октября 2010

Использовать MSBuild условие .

Например, предположим, что ваш проект имеет конфигурацию под названием «DebugMono», которая является версией Mono обычной конфигурации «Debug», просто поместите атрибут условия в соответствующий элемент ссылочного элемента, который проверяет значение свойства «Configuration»:

<Reference Include="Mono.Xsp" Condition="'$(Configuration)'=='DebugMono'" />
2 голосов
/ 24 октября 2010

Я не знаю, можно ли этого достичь. Но вы можете подумать о позднем связывании сборки с помощью отражения, получая экземпляр нужных вам объектов и методов. Это дает вам представление о том, что вы бы сделали это:

// Wrapper class:
public class Listener
{
    public void Start()
    {
        bool useMono = true; // TODO: Get this from config
        if (!useMono)
        {
            // Bind directly to this as it will be available in Mono too
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:8081/foo/");
            listener.Prefixes.Add("http://127.0.0.1:8081/foo/");
            listener.Start();
        }
        else
        {
            Assembly asm = Assembly.Load("TheNameOfTheAssembly");

            Type type = asm.GetTypes().Where(x => x.Name == "TheType").FirstOrDefault();
            object obj = Activator.CreateInstance(type);
            MethodInfo mi = type.GetMethod("NameOfMethod");
            mi.Invoke(obj, null); // invoke with list of parameters
        }
    }
}

Вы можете заменить реализацию такого рода, когда ошибка будет исправлена.

...