internal class Program
{
private static bool IsInterFaceDll(FileInfo file)
{
Assembly ass = Assembly.LoadFile(file.FullName);
Type[] types = ass.GetTypes();
Type sContractType = typeof(ServiceContractAttribute);
foreach (Type type in types)
{
if (type.IsInterface)
{
Object[] aa = type.GetCustomAttributes(false);
foreach (Object a in aa)
{
if (a.ToString() == sContractType.ToString())
{
return true;
}
}
}
}
return false;
}
private static List<Type> GetInterFaceTypes(FileInfo file)
{
List<Type> result = new List<Type>();
Assembly ass = Assembly.LoadFile(file.FullName);
Type[] types = ass.GetTypes();
Type sContractType = typeof(ServiceContractAttribute);
foreach (Type type in types)
{
if (type.IsInterface)
{
Object[] aa = type.GetCustomAttributes(false);
foreach (Object a in aa)
{
if (a.ToString() == sContractType.ToString())
{
result.Add(type);
}
}
}
}
return result;
}
private static void Main(string[] args)
{
try
{
DirectoryInfo directory = new DirectoryInfo(Environment.CurrentDirectory);
FileInfo[] files = directory.GetFiles();
List<FileInfo> list = new List<FileInfo>();
foreach (FileInfo file in files)
{
if (file.Extension.ToLower() == ".dll")
{
if (IsInterFaceDll(file))
{
list.Add(file);
}
}
}
string IP= ConfigurationManager.AppSettings["IP"];
Uri baseHttpAddress = new Uri(string.Format("http://{0}/Bll/", IP));
Uri baseTcpAddress = new Uri(string.Format("net.tcp://{0}/Bll/", IP));
string impAssemblyName = string.Empty;
string strClassType = string.Empty;
Type classType = null;
ServiceHost host = null;
Binding wsBinding = null;
Binding tcpBinding = null;
List<Type> interFaceList=new List<Type>();
ServiceMetadataBehavior metadataBehavior = null;
for (int i = 0; i < list.Count; i++)
{
impAssemblyName = list[i].ToString().Replace(".Contract", "");
interFaceList = GetInterFaceTypes(list[i]);
foreach (Type myType in interFaceList)
{
strClassType = myType.ToString().Replace(".Contract.I", ".");
classType =Assembly.LoadFrom(impAssemblyName).GetType(strClassType);
host = new ServiceHost(classType, new Uri[] { baseHttpAddress, baseTcpAddress });
wsBinding = new WSHttpBinding();
tcpBinding = new NetTcpBinding();
host.AddServiceEndpoint(myType, wsBinding, "");
host.AddServiceEndpoint(myType, tcpBinding, "tcp");
metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metadataBehavior == null)
{
metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(metadataBehavior);
}
host.Open();
Console.WriteLine("契约接口:{0};", myType);
Console.WriteLine(" 实现类:{0}", classType);
Console.WriteLine("Host start...");
Console.WriteLine();
}
}
Console.ReadLine();
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.ReadLine();
}
}
}