private static void InjectConnectionString(DashingSettings dashingSettings, ConnectionStringSettings connectionStringSettings) {
var assemblyDefinition = AssemblyDefinition.ReadAssembly(dashingSettings.PathToDll);
var cecilConfigType = assemblyDefinition.MainModule.Types.Single(t => t.FullName == dashingSettings.ConfigurationName);
var constructor = cecilConfigType.Methods.FirstOrDefault(m => m.IsConstructor && !m.HasParameters); // default constructor
if (constructor == null) {
using (Color(ConsoleColor.Red)) {
throw new CatchyException("Unable to find a Default Constructor on the Configuration");
}
}
var getConnectionStringCall =
constructor.Body.Instructions.FirstOrDefault(
i =>
i.OpCode.Code == Code.Call
&& i.Operand.ToString()
== "System.Configuration.ConnectionStringSettingsCollection System.Configuration.ConfigurationManager::get_ConnectionStrings()");
if (getConnectionStringCall == null) {
using (Color(ConsoleColor.Red)) {
throw new CatchyException("Unable to find the ConnectionStrings call in the constructor");
}
}
var connectionStringKey = getConnectionStringCall.Next.Operand.ToString();
// override readonly property of connectionstrings
var readOnlyField = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
if (readOnlyField != null) {
readOnlyField.SetValue(ConfigurationManager.ConnectionStrings, false);
}
// remove any existing
if (ConfigurationManager.ConnectionStrings[connectionStringKey] != null) {
ConfigurationManager.ConnectionStrings.Remove(connectionStringKey);
}
// and add in the one from our ini
ConfigurationManager.ConnectionStrings.Add(
new System.Configuration.ConnectionStringSettings(
connectionStringKey,
connectionStringSettings.ConnectionString,
connectionStringSettings.ProviderName));
}