Search
Write a publication
Pull to refresh

Comments 12

Я раньше хотел использовать кассини для того чтобы WinForms приложение было одновременно и веб сервером.

Понял, что с кассини уж слишком много проблем, и заюзал Mono XSP (Mono.WebServer2).

Кстати, вот пример того, как можно в GAC зарегистрировать необходимую DLL с сервером:


using System.EnterpriseServices.Internal;

        public static void GacRegisterHost()
        {
            Publish pub = new Publish();
            
            pub.GacInstall(AppDomain.CurrentDomain.BaseDirectory + @"\Mono.Security.dll");
            pub.GacInstall(AppDomain.CurrentDomain.BaseDirectory + @"\Mono.Security.Win32.dll");
            pub.GacInstall(AppDomain.CurrentDomain.BaseDirectory + @"\Mono.WebServer2.dll");
        }
Это другая инкарнация Кассини — от Робсмана. В статье рассматривается Кассини из поставки Visual Studio 2010.
P.S.: сборка по вашей ссылке (http://cassinidev.codeplex.com/) тоже умеет работать без регистрации в Москве в GAC
Точно. Спасибо за наводку. Единственное что я могу сказать, что таки проблему с регистрацией GACке Cassini++ решил, но какой ценой… ценой черной магии ;)
Привожу код решения:

\src\Cassini++\WebServer\Server.cs


		private static Host CreateWorkerAppDomainWithHost(string virtualPath, string physicalPath)
		{
            var hostType = typeof(Host);

			// this creates worker app domain in a way that host doesn't need to be in GAC or bin
			// using BuildManagerHost via private reflection
			string uniqueAppString = string.Concat(virtualPath, physicalPath).ToLowerInvariant();
			string appId = (uniqueAppString.GetHashCode()).ToString("x", CultureInfo.InvariantCulture);

			// create BuildManagerHost in the worker app domain
			var appManager = ApplicationManager.GetApplicationManager();
			var buildManagerHostType = typeof (HttpRuntime).Assembly.GetType("System.Web.Compilation.BuildManagerHost");
			var buildManagerHost = appManager.CreateObject(appId, buildManagerHostType, virtualPath, physicalPath, false);

			// call BuildManagerHost.RegisterAssembly to make Host type loadable in the worker app domain
			buildManagerHostType.InvokeMember(
				"RegisterAssembly",
				BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic,
				null,
				buildManagerHost,
				new object[2] {hostType.Assembly.FullName, hostType.Assembly.Location});

			// create Host in the worker app domain
            return (Host)appManager.CreateObject(appId, hostType, virtualPath, physicalPath, false);
		}

Плюс Cassini — доступные исходники
Запускаю последнюю сборку, сжирает всю память создавая несколько сотен процессов себя, система перестает отзываться, потом тихо умирает и завершается :)
Еще в список отличий: Cassini не поддерживает ipv6, потому что выполняет bind хардкодом на 127.0.0.1
К Cassini++ в свое время прикручивал IPv6 без особых проблем
Sign up to leave a comment.

Articles