Исключение Mono TypeLoadException в ChannelFactory.CreateChannel, без исключения в .NET / Windows

#c# #wcf #c#-4.0 #mono #typeloadexception

#c# #wcf #c #-4.0 #mono #исключение typeloadexception

Вопрос:

Я создаю службу WCF на основе net.tcp для управления одним из наших внутренних приложений. Во время разработки и тестирования на компьютере с Windows все работало так, как ожидалось. Однако, когда я попытался запустить то же самое приложение, используя Mono, либо в том же окне Windows (Mono 2.10.6), либо в Debian Squeeze (с Mono 2.10.5), я внезапно получаю TypeLoadException в ChannelFactory .

В итоге все сводится только к этому вызову, который завершается неудачей:

 controlHost = ChannelFactory<IControlServiceContract>.CreateChannel(
    new NetTcpBinding(SecurityMode.None),
    new EndpointAddress(endpointAddress)
);
  

С этим определением для IControlServiceContract в другой сборке:

 [ServiceContract]
public interface IControlServiceContract
{
    [OperationContract(IsOneWay = true)]
    void Ping ();

    [OperationContract(IsOneWay = true)]
    void Shutdown ();

    [OperationContract]
    int GetCommandCount ();        
}
  

Который отлично запускается при непосредственном запуске (т. Е. с использованием .NET).

При выполнении с использованием mono --debug --runtime=v4.0 , однако, происходит сбой с этой супер приятной трассировкой стека:

 ! Ein Fehler ist beim Erzeugen des Kanals auf net.tcp://localhost:34684/watchdog/watchdog.ctrl/ aufgetreten

   A type load exception has occurred.
  at System.Linq.Enumerable.Union[Object] (IEnumerable`1 first, IEnumerable`1 second, IEqualityComparer`1 comparer) [0x00014] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.CoreSystem.LinqEnumerable.cs:2948
  at System.Linq.Enumerable.Union[Object] (IEnumerable`1 first, IEnumerable`1 second) [0x00007] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.CoreSystem.LinqEnumerable.cs:2938
  at System.ServiceModel.Description.ContractDescriptionGenerator.GetOrCreateOperation (System.ServiceModel.Description.ContractDescription cd, System.Reflection.MethodInfo mi, System.Reflection.MethodInfo serviceMethod, System.ServiceModel.OperationContractAttribute oca, System.Type asyncReturnType, Boolean isCallback, System.Type givenServiceType) [0x001f2] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescriptionGenerator.cs:314
  at System.ServiceModel.Description.ContractDescriptionGenerator.FillOperationsForInterface (System.ServiceModel.Description.ContractDescription cd, System.Type exactContractType, System.Type givenServiceType, Boolean isCallback) [0x00131] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescriptionGenerator.cs:240
  at System.ServiceModel.Description.ContractDescriptionGenerator.GetContractInternal (System.Type givenContractType, System.Type givenServiceType, System.TypeserviceTypeForCallback) [0x00296] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescriptionGenerator.cs:197
  at System.ServiceModel.Description.ContractDescriptionGenerator.GetContract (System.Type givenContractType, System.Type givenServiceType, System.Type serviceTypeForCallback) [0x00000] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescriptionGenerator.cs:136
  at System.ServiceModel.Description.ContractDescriptionGenerator.GetContract (System.Type givenContractType, System.Type givenServiceType) [0x00000] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescriptionGenerator.cs:131
  at System.ServiceModel.Description.ContractDescriptionGenerator.GetContract (System.Type contractType) [0x00000] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescriptionGenerator.cs:101
  at System.ServiceModel.Description.ContractDescription.GetContract (System.Type contractType) [0x00017] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModel.DescriptionContractDescription.cs:66
  at System.ServiceModel.ChannelFactory`1[com.derixx.dll.controlservicehost.ServiceBase.IControlServiceContract].CreateDescription () [0x00000] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModelChannelFactory_1.cs:185
  at System.ServiceModel.ChannelFactory`1[com.derixx.dll.controlservicehost.ServiceBase.IControlServiceContract]..ctor (System.Type type) [0x00033] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModelChannelFactory_1.cs:56
  at System.ServiceModel.ChannelFactory`1[com.derixx.dll.controlservicehost.ServiceBase.IControlServiceContract]..ctor (System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) [0x00000] in <filename unknown>:0
  at System.ServiceModel.ChannelFactory`1[com.derixx.dll.controlservicehost.ServiceBase.IControlServiceContract].CreateChannel (System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address) [0x00000] in C:cygwintmpmonobuildbuildBUILDmono-2.10.6mcsclassSystem.ServiceModelSystem.ServiceModelChannelFactory_1.cs:130
  at applicationframework.ControlApplicationBase.ConnectionCreate (IControlServiceContractamp; controlHost, System.String endpointHost, Int32 endpointPort, System.String endpointPath) [0x00000] in <filename unknown>:0
  

Все сборки, используемые в его проекте, являются либо нашими собственными, ориентированными на Framework 4.0, базовые сборки и log4net 1.2.10 / 2.0.50727.

Кто-нибудь имеет представление, что это может быть и с чего мне следует начать копать?

Ответ №1:

Что ж, если это работает на .NET, а не Mono, это определенно ошибка.

Я бы пошел дальше и первым делом отправил его вhttp://bugzilla.xamarin.com/

Тогда, возможно, hangout в irc://irc.gnome.org/mono и ткните в Ацуши Эномото (ник «eno»), который является сопровождающим WCF, чтобы узнать, что он думает.

Комментарии:

1. Какой номер ошибки вы создали? Вы получили разрешение?