Отключить подпись для Castle DynamicProxy - PullRequest
2 голосов
/ 13 марта 2012

У меня проблемы при попытке использовать TypedFactoryFacility в Castle.

Я использую Castle v3.0.0 и создал ViewFactory, используя

injector.AddFacility(Of TypedFactoryFacility)()

и

container.Register(CMR.Component.For(Of IDialogViewFactory)().AsFactory())

Этот код отлично работает на моем компьютере, но при его развертывании для пользователей на виртуальных машинах (у которых нет прав локального администратора) они получают следующую ошибку:

Unable to obtain public key for StrongNameKeyPair.

Существуют различные темы, но, похоже, ничего не решает мою проблему - как я могу использовать DynamicProxy на компьютерах, которые не имеют / не имеют доступа к C: \ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \

В трассировке стека ошибок есть строка

Castle.DynamicProxy.ModuleScope.CreateModule(signStrongName As Boolean)

Что, по-видимому, предполагает, что сильные имена можно как-то отключить, но я не могу понять, как?

Ответы [ 4 ]

3 голосов
/ 01 июля 2012

в (следующей) версии 3.1 вы можете сделать это сразу после создания контейнера:

Container.Kernel.ProxyFactory = new DefaultProxyFactory(disableSignedModule: true);

В версии 3.0 или старше вы можете наследовать от DefaultProxyFactory и установить значение оттуда.

0 голосов
/ 07 марта 2013

Для всех, кто сталкивался с этим, у меня было такое же исключение на физической машине.За ночь ничего не изменилось, но это исключение начало появляться утром.

Оказалось, что проблема с нехваткой места на диске, и динамические прокси-сборки не могут быть записаны на диск.Только понял это, потому что я случайно заметил значок Windows «мало места на диске», когда он появился ненадолго.: -Р

0 голосов
/ 17 марта 2012

Когда у нас появилась эта ошибка, эта статья исправила ее:

http://ayende.com/blog/1441/unable-to-obtain-public-key-for-strongnamekeypair

Каким-то образом настройки безопасности по умолчанию испортились.То же самое произошло и у нас в одночасье на производственном сервере.

0 голосов
/ 16 марта 2012

Вы пытались установить область действия ProxyObjectReference с помощью собственного ModuleScope?

var scope = new ModuleScope(
                        savePhysicalAssembly,
                        true /*disableSignedModule*/,
                        strongModulePath,
                        weakAssemblyName,
                        weakModulePath);

ProxyObjectReference.SetScope(scope);
...