private static string GetDefaultConfigurationString(Func<Assembly, string[]> defaultTypeNames)
{
var info = AppDomain.CurrentDomain.SetupInformation;
IEnumerable<string> searchPaths = new string[0];
if (info.PrivateBinPathProbe == null || string.IsNullOrWhiteSpace(info.PrivateBinPath))
{
// Check the current directory
searchPaths = searchPaths.Concat(new string[] { string.Empty });
}
if (!string.IsNullOrWhiteSpace(info.PrivateBinPath))
{
// PrivateBinPath may be a semicolon separated list of subdirectories.
searchPaths = searchPaths.Concat(info.PrivateBinPath.Split(';'));
}
foreach (string searchPath in searchPaths)
{
var assembliesPath = Path.Combine(info.ApplicationBase, searchPath);
if (!Directory.Exists(assembliesPath))
{
continue;
}
var files = Directory.GetFiles(assembliesPath, "*.dll")
.Concat(Directory.GetFiles(assembliesPath, "*.exe"));
foreach (var file in files)
{
try
{
var reflectionOnlyAssembly = Assembly.ReflectionOnlyLoadFrom(file);
var assemblyFullName = reflectionOnlyAssembly.FullName;
foreach (var possibleType in defaultTypeNames(reflectionOnlyAssembly))
{
var startupType = reflectionOnlyAssembly.GetType(possibleType, false);
if (startupType != null)
{
return possibleType + ", " + assemblyFullName;
}
}
}
catch (BadImageFormatException)
{
// Not a managed dll/exe
}
}
}
return null;
}