Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Tools / comsvcutil / ComplusTypeValidator.cs / 1305376 / ComplusTypeValidator.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.Tools.ServiceModel.ComSvcConfig
{
using System;
using System.ServiceModel.Channels;
using System.Globalization;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Reflection;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Microsoft.Tools.ServiceModel;
using Microsoft.Tools.ServiceModel.SvcUtil;
static class ComPlusTypeValidator
{
static Guid IID_Object = new Guid("{65074F7F-63C0-304E-AF0A-D51741CB4A8D}");
static Guid IID_IDisposable = new Guid("{805D7A98-D4AF-3F0F-967F-E5CF45312D2C}");
static Guid IID_IManagedObject = new Guid("{C3FCC19E-A970-11D2-8B5A-00A0C9B7C9C4}");
static Guid IID_IProcessInitializer = new Guid("{1113F52D-DC7F-4943-AED6-88D04027E32A}");
static Guid IID_IRemoteDispatch = new Guid("{6619A740-8154-43BE-A186-0319578E02DB}");
static Guid IID_IServicedComponentInfo = new Guid("{8165B19E-8D3A-4D0B-80C8-97DE310DB583}");
static Guid IID_IComponentRegistrar = new Guid ("{A817E7A2-43FA-11D0-9E44-00AA00B6770A}");
static internal bool DerivesFromServicedComponent(Guid iid, Guid clsid)
{
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object[] args = new object[3] { iid, false, true };
Assembly asm = null;
try
{
asm = typeOfInterfaceResolver.InvokeMember("ResolveAssemblyFromIID", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture) as Assembly;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw;
Console.WriteLine(iid + ", " + clsid);
return false;
}
bool inherits = false;
foreach (Type t in asm.GetTypes())
{
if (t.GUID == clsid)
{
Type baseType = t.BaseType;
while (null != baseType)
{
if (typeof(ServicedComponent) == baseType)
{
inherits = true;
break;
}
baseType = baseType.BaseType;
}
}
}
return inherits;
}
static internal bool VerifyInterface(ComAdminInterfaceInfo interfaceInfo, bool allowReferences, Guid clsid)
{
return VerifyInterface(interfaceInfo, allowReferences, clsid, false);
}
static internal bool VerifyInterface(ComAdminInterfaceInfo interfaceInfo, bool allowReferences, Guid clsid, bool produceError)
{
if (IsInternalInterface (interfaceInfo.Iid))
{
if(produceError)
ToolConsole.WriteError(SR.GetString(SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name));
return false;
}
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object [] args = new object [1] { interfaceInfo.Iid};
Type typeOfInterface = null;
try
{
typeOfInterface = typeOfInterfaceResolver.InvokeMember ("VerifyType", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture ) as Type;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw CreateDescriptiveException((System.IO.FileNotFoundException)e.GetBaseException());
string exceptionMessage = SR.GetString(SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, e.InnerException.Message);
if (DerivesFromServicedComponent(interfaceInfo.Iid, clsid))
exceptionMessage += " " + SR.GetString(SR.ClassInterfacesNotSupported);
if (produceError)
ToolConsole.WriteError(exceptionMessage, "");
else
ToolConsole.WriteNonVerboseWarning(exceptionMessage);
return false;
}
MethodInfo [] methods = typeOfInterface.GetMethods ();
if (methods.Length == 0)
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteNonVerboseWarning(SR.GetString(SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name));
return false;
}
string typeMismatchDetails;
foreach (MethodInfo method in methods)
{
foreach (ParameterInfo parameter in method.GetParameters())
{
Type typeOfParam = parameter.ParameterType;
if (typeOfParam.IsByRef)
typeOfParam = typeOfParam.GetElementType();
if (!IsValidParameter(typeOfParam, parameter, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails), "");
else
ToolConsole.WriteNonVerboseWarning (SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails));
return false;
}
}
if (!IsValidParameter(method.ReturnType, method.ReturnTypeCustomAttributes, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails), "");
else
ToolConsole.WriteNonVerboseWarning(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails));
return false;
}
}
return true;
}
public static List FetchAllMethodsForInterface(ComAdminInterfaceInfo interfaceInfo)
{
return FetchAllMethodsForInterface(interfaceInfo, true);
}
public static List FetchAllMethodsForInterface (ComAdminInterfaceInfo interfaceInfo, bool produceWarning)
{
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object [] args = new object [1] { interfaceInfo.Iid};
Type typeOfInterface = null;
try
{
typeOfInterface = typeOfInterfaceResolver.InvokeMember ("VerifyType", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture ) as Type;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw CreateDescriptiveException((System.IO.FileNotFoundException)e.GetBaseException());
if(produceWarning)
ToolConsole.WriteWarning (SR.GetString (SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, e.InnerException.Message));
return null;
}
MethodInfo [] methods = typeOfInterface.GetMethods ();
if (methods.Length == 0)
return null;
else
{
List methodNames = new List ();
foreach (MethodBase method in methods)
methodNames.Add (method.Name);
return methodNames;
}
}
static Exception CreateDescriptiveException(System.IO.FileNotFoundException oldException)
{
return new Exception(oldException.Message + " " + SR.GetString(SR.InstallInGAC, oldException.FileName));
}
public static bool VerifyInterfaceMethods(ComAdminInterfaceInfo interfaceInfo, IList methodNames, bool allowReferences, bool produceError)
{
if (IsInternalInterface (interfaceInfo.Iid))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name));
return false;
}
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object [] args = new object [1] { interfaceInfo.Iid};
Type typeOfInterface = null;
try
{
typeOfInterface = typeOfInterfaceResolver.InvokeMember ("VerifyType", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture ) as Type;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw CreateDescriptiveException((System.IO.FileNotFoundException)e.GetBaseException());
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, e.InnerException.Message), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, e.InnerException.Message));
return false;
}
MethodInfo [] methods = typeOfInterface.GetMethods ();
if (methods.Length == 0)
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name));
return false;
}
string typeMismatchDetails;
bool found = false;
foreach (string methodName in methodNames)
{
found = false;
foreach (MethodInfo method in methods)
{
if (methodName == method.Name)
{
found = true;
foreach (ParameterInfo parameter in method.GetParameters ())
{
Type typeOfParam = parameter.ParameterType;
if (typeOfParam.IsByRef)
typeOfParam = typeOfParam.GetElementType();
if (!IsValidParameter(typeOfParam, parameter, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails), "");
else
ToolConsole.WriteWarning (SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails));
return false;
}
}
if (!IsValidParameter(method.ReturnType, method.ReturnTypeCustomAttributes, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails), "");
else
ToolConsole.WriteWarning(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails));
return false;
}
}
}
if (!found)
{
throw Tool.CreateException (SR.GetString(SR.MethodNotFoundOnInterface, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, methodName), null);
}
}
return true;
}
public static bool IsInternalInterface (Guid iid)
{
if (iid == IID_Object ||
iid == IID_IDisposable ||
iid == IID_IManagedObject ||
iid == IID_IProcessInitializer ||
iid == IID_IRemoteDispatch ||
iid == IID_IServicedComponentInfo ||
iid == IID_IComponentRegistrar ||
iid.ToString("D").ToLowerInvariant().EndsWith("c000-000000000046", StringComparison.Ordinal)) //other ole/com standard interfaces
{
return true;
}
return false;
}
public static bool IsValidParameter(Type type, ICustomAttributeProvider attributeProvider, bool allowReferences, out string typeMismatchDetails)
{
typeMismatchDetails = type.ToString () + " " ;
object[] attributes = attributeProvider.GetCustomAttributes(typeof(MarshalAsAttribute), true);
foreach (MarshalAsAttribute attr in attributes)
{
UnmanagedType marshalAs = attr.Value;
if (marshalAs == UnmanagedType.IDispatch ||
marshalAs == UnmanagedType.Interface ||
marshalAs == UnmanagedType.IUnknown)
{
if(!allowReferences)
typeMismatchDetails += SR.GetString (SR.HasMarshalAsAttributeOfType, marshalAs);
return allowReferences;
}
}
XsdDataContractExporter exporter = new XsdDataContractExporter();
if (!exporter.CanExport(type))
{
typeMismatchDetails += SR.GetString (SR.CannotBeExportedByDataContractExporter);
return false;
}
return true;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.Tools.ServiceModel.ComSvcConfig
{
using System;
using System.ServiceModel.Channels;
using System.Globalization;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Reflection;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Microsoft.Tools.ServiceModel;
using Microsoft.Tools.ServiceModel.SvcUtil;
static class ComPlusTypeValidator
{
static Guid IID_Object = new Guid("{65074F7F-63C0-304E-AF0A-D51741CB4A8D}");
static Guid IID_IDisposable = new Guid("{805D7A98-D4AF-3F0F-967F-E5CF45312D2C}");
static Guid IID_IManagedObject = new Guid("{C3FCC19E-A970-11D2-8B5A-00A0C9B7C9C4}");
static Guid IID_IProcessInitializer = new Guid("{1113F52D-DC7F-4943-AED6-88D04027E32A}");
static Guid IID_IRemoteDispatch = new Guid("{6619A740-8154-43BE-A186-0319578E02DB}");
static Guid IID_IServicedComponentInfo = new Guid("{8165B19E-8D3A-4D0B-80C8-97DE310DB583}");
static Guid IID_IComponentRegistrar = new Guid ("{A817E7A2-43FA-11D0-9E44-00AA00B6770A}");
static internal bool DerivesFromServicedComponent(Guid iid, Guid clsid)
{
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object[] args = new object[3] { iid, false, true };
Assembly asm = null;
try
{
asm = typeOfInterfaceResolver.InvokeMember("ResolveAssemblyFromIID", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture) as Assembly;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw;
Console.WriteLine(iid + ", " + clsid);
return false;
}
bool inherits = false;
foreach (Type t in asm.GetTypes())
{
if (t.GUID == clsid)
{
Type baseType = t.BaseType;
while (null != baseType)
{
if (typeof(ServicedComponent) == baseType)
{
inherits = true;
break;
}
baseType = baseType.BaseType;
}
}
}
return inherits;
}
static internal bool VerifyInterface(ComAdminInterfaceInfo interfaceInfo, bool allowReferences, Guid clsid)
{
return VerifyInterface(interfaceInfo, allowReferences, clsid, false);
}
static internal bool VerifyInterface(ComAdminInterfaceInfo interfaceInfo, bool allowReferences, Guid clsid, bool produceError)
{
if (IsInternalInterface (interfaceInfo.Iid))
{
if(produceError)
ToolConsole.WriteError(SR.GetString(SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name));
return false;
}
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object [] args = new object [1] { interfaceInfo.Iid};
Type typeOfInterface = null;
try
{
typeOfInterface = typeOfInterfaceResolver.InvokeMember ("VerifyType", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture ) as Type;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw CreateDescriptiveException((System.IO.FileNotFoundException)e.GetBaseException());
string exceptionMessage = SR.GetString(SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, e.InnerException.Message);
if (DerivesFromServicedComponent(interfaceInfo.Iid, clsid))
exceptionMessage += " " + SR.GetString(SR.ClassInterfacesNotSupported);
if (produceError)
ToolConsole.WriteError(exceptionMessage, "");
else
ToolConsole.WriteNonVerboseWarning(exceptionMessage);
return false;
}
MethodInfo [] methods = typeOfInterface.GetMethods ();
if (methods.Length == 0)
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteNonVerboseWarning(SR.GetString(SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name));
return false;
}
string typeMismatchDetails;
foreach (MethodInfo method in methods)
{
foreach (ParameterInfo parameter in method.GetParameters())
{
Type typeOfParam = parameter.ParameterType;
if (typeOfParam.IsByRef)
typeOfParam = typeOfParam.GetElementType();
if (!IsValidParameter(typeOfParam, parameter, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails), "");
else
ToolConsole.WriteNonVerboseWarning (SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails));
return false;
}
}
if (!IsValidParameter(method.ReturnType, method.ReturnTypeCustomAttributes, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails), "");
else
ToolConsole.WriteNonVerboseWarning(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails));
return false;
}
}
return true;
}
public static List FetchAllMethodsForInterface(ComAdminInterfaceInfo interfaceInfo)
{
return FetchAllMethodsForInterface(interfaceInfo, true);
}
public static List FetchAllMethodsForInterface (ComAdminInterfaceInfo interfaceInfo, bool produceWarning)
{
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object [] args = new object [1] { interfaceInfo.Iid};
Type typeOfInterface = null;
try
{
typeOfInterface = typeOfInterfaceResolver.InvokeMember ("VerifyType", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture ) as Type;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw CreateDescriptiveException((System.IO.FileNotFoundException)e.GetBaseException());
if(produceWarning)
ToolConsole.WriteWarning (SR.GetString (SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, e.InnerException.Message));
return null;
}
MethodInfo [] methods = typeOfInterface.GetMethods ();
if (methods.Length == 0)
return null;
else
{
List methodNames = new List ();
foreach (MethodBase method in methods)
methodNames.Add (method.Name);
return methodNames;
}
}
static Exception CreateDescriptiveException(System.IO.FileNotFoundException oldException)
{
return new Exception(oldException.Message + " " + SR.GetString(SR.InstallInGAC, oldException.FileName));
}
public static bool VerifyInterfaceMethods(ComAdminInterfaceInfo interfaceInfo, IList methodNames, bool allowReferences, bool produceError)
{
if (IsInternalInterface (interfaceInfo.Iid))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.IsInternalInterfaceAndCannotBeExposedOverWebService, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name));
return false;
}
Type typeOfInterfaceResolver = typeof(Message).Assembly.GetType("System.ServiceModel.ComIntegration.TypeCacheManager");
object resolver = typeOfInterfaceResolver.InvokeMember("Provider", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null, CultureInfo.InvariantCulture);
object [] args = new object [1] { interfaceInfo.Iid};
Type typeOfInterface = null;
try
{
typeOfInterface = typeOfInterfaceResolver.InvokeMember ("VerifyType", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, resolver, args, CultureInfo.InvariantCulture ) as Type;
}
catch (TargetInvocationException e)
{
if (e.GetBaseException() is System.IO.FileNotFoundException)
throw CreateDescriptiveException((System.IO.FileNotFoundException)e.GetBaseException());
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, e.InnerException.Message), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.TypeResolutionForInterfaceFailed, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, e.InnerException.Message));
return false;
}
MethodInfo [] methods = typeOfInterface.GetMethods ();
if (methods.Length == 0)
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name), "");
else
ToolConsole.WriteWarning (SR.GetString (SR.InterfaceHasNoMethods, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name));
return false;
}
string typeMismatchDetails;
bool found = false;
foreach (string methodName in methodNames)
{
found = false;
foreach (MethodInfo method in methods)
{
if (methodName == method.Name)
{
found = true;
foreach (ParameterInfo parameter in method.GetParameters ())
{
Type typeOfParam = parameter.ParameterType;
if (typeOfParam.IsByRef)
typeOfParam = typeOfParam.GetElementType();
if (!IsValidParameter(typeOfParam, parameter, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails), "");
else
ToolConsole.WriteWarning (SR.GetString(SR.ParameterOfMethodInInterfaceHasANonCompliantType, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, method.Name, parameter.Name, typeMismatchDetails));
return false;
}
}
if (!IsValidParameter(method.ReturnType, method.ReturnTypeCustomAttributes, allowReferences, out typeMismatchDetails))
{
if (produceError)
ToolConsole.WriteError(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails), "");
else
ToolConsole.WriteWarning(SR.GetString(SR.InvalidWebServiceReturnValue, method.ReturnType.Name, method.Name, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString("B") : interfaceInfo.Name, typeMismatchDetails));
return false;
}
}
}
if (!found)
{
throw Tool.CreateException (SR.GetString(SR.MethodNotFoundOnInterface, Tool.Options.ShowGuids ? interfaceInfo.Iid.ToString ("B") : interfaceInfo.Name, methodName), null);
}
}
return true;
}
public static bool IsInternalInterface (Guid iid)
{
if (iid == IID_Object ||
iid == IID_IDisposable ||
iid == IID_IManagedObject ||
iid == IID_IProcessInitializer ||
iid == IID_IRemoteDispatch ||
iid == IID_IServicedComponentInfo ||
iid == IID_IComponentRegistrar ||
iid.ToString("D").ToLowerInvariant().EndsWith("c000-000000000046", StringComparison.Ordinal)) //other ole/com standard interfaces
{
return true;
}
return false;
}
public static bool IsValidParameter(Type type, ICustomAttributeProvider attributeProvider, bool allowReferences, out string typeMismatchDetails)
{
typeMismatchDetails = type.ToString () + " " ;
object[] attributes = attributeProvider.GetCustomAttributes(typeof(MarshalAsAttribute), true);
foreach (MarshalAsAttribute attr in attributes)
{
UnmanagedType marshalAs = attr.Value;
if (marshalAs == UnmanagedType.IDispatch ||
marshalAs == UnmanagedType.Interface ||
marshalAs == UnmanagedType.IUnknown)
{
if(!allowReferences)
typeMismatchDetails += SR.GetString (SR.HasMarshalAsAttributeOfType, marshalAs);
return allowReferences;
}
}
XsdDataContractExporter exporter = new XsdDataContractExporter();
if (!exporter.CanExport(type))
{
typeMismatchDetails += SR.GetString (SR.CannotBeExportedByDataContractExporter);
return false;
}
return true;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EncodingNLS.cs
- SqlDataSourceStatusEventArgs.cs
- AuthenticationServiceManager.cs
- BamlStream.cs
- WindowsAuthenticationModule.cs
- FamilyTypeface.cs
- StaticFileHandler.cs
- ASCIIEncoding.cs
- InstanceData.cs
- AVElementHelper.cs
- BCLDebug.cs
- StringDictionaryCodeDomSerializer.cs
- ItemAutomationPeer.cs
- _LocalDataStoreMgr.cs
- DataGridViewComboBoxColumn.cs
- UnknownBitmapEncoder.cs
- Menu.cs
- RoleManagerModule.cs
- ConfigurationLocationCollection.cs
- InputReportEventArgs.cs
- ListViewGroup.cs
- ReflectionPermission.cs
- DbCommandDefinition.cs
- NodeFunctions.cs
- CounterSetInstance.cs
- FaultException.cs
- DynamicEntity.cs
- Int16Converter.cs
- MetadataArtifactLoader.cs
- TextEditorParagraphs.cs
- StringUtil.cs
- HorizontalAlignConverter.cs
- SurrogateEncoder.cs
- BoundPropertyEntry.cs
- SQLDecimalStorage.cs
- CryptographicAttribute.cs
- FileStream.cs
- DbBuffer.cs
- TextParaLineResult.cs
- ConfigurationValidatorBase.cs
- TextEndOfParagraph.cs
- QueryOutputWriter.cs
- RIPEMD160Managed.cs
- SynchronizedInputPattern.cs
- ChannelManager.cs
- CancellationScope.cs
- ProxyAttribute.cs
- StyleHelper.cs
- designeractionlistschangedeventargs.cs
- EncodingDataItem.cs
- ColorAnimationUsingKeyFrames.cs
- SafePEFileHandle.cs
- SqlDelegatedTransaction.cs
- WebPartExportVerb.cs
- DataKey.cs
- DocumentGridPage.cs
- ContravarianceAdapter.cs
- EmptyControlCollection.cs
- TextAdaptor.cs
- CompiledRegexRunner.cs
- DataControlCommands.cs
- ResourceContainer.cs
- CreateParams.cs
- CqlQuery.cs
- WinEventQueueItem.cs
- Stacktrace.cs
- EUCJPEncoding.cs
- ControlCollection.cs
- StrokeIntersection.cs
- _Events.cs
- DesignerOptions.cs
- SimpleExpression.cs
- XpsPackagingPolicy.cs
- NTAccount.cs
- InputScopeNameConverter.cs
- Literal.cs
- EpmSyndicationContentDeSerializer.cs
- Logging.cs
- Stackframe.cs
- WorkflowInstance.cs
- QueryRewriter.cs
- SyndicationSerializer.cs
- WebRequestModulesSection.cs
- Latin1Encoding.cs
- XPathMessageFilterElementCollection.cs
- DbCommandTree.cs
- ContextBase.cs
- StrongName.cs
- DataGridTablesFactory.cs
- X509IssuerSerialKeyIdentifierClause.cs
- HtmlForm.cs
- RC2.cs
- ViewStateChangedEventArgs.cs
- ConstructorArgumentAttribute.cs
- SingleResultAttribute.cs
- DBDataPermission.cs
- CompilerParameters.cs
- Single.cs
- WebServiceClientProxyGenerator.cs
- CqlParserHelpers.cs