2010-10-05 3 views
0

У меня есть проект установщика Windows, который включает в себя настраиваемое действие. Это настраиваемое действие использует SMO для настройки базы данных. Проект установщика .Net 4. При выполнении пользовательских действий, я получаю следующее сообщение об ошибке:vs2010 Сборки смешанного режима в пользовательских действиях установщика Windows

Mixed mode assembly is built against version 'v2.0.50727' of the runtime 
and cannot be loaded in the 4.0 runtime without additional configuration information. 

Я мог бы запустить код обновления базы данных в отдельном исполняемом файле или переписать пользовательское действие так SMO не используется, но я скорее всего, сохраните код как есть, если это возможно.

Я знаю, как исправить это в консольных приложениях Winforms, добавив следующее в файл app.config.

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 

Вопрос в том, как я могу сделать это или что-то подобное с проектом установщика? Я все еще получаю эту проблему, когда все ссылочные сборки в пользовательском действии являются работой фрейма 2, поэтому это должно быть вызвано самой MSI, которая является .net4 в соответствии с программой просмотра журнала Fusion.

ответ

0

В конце концов я решил запустить приложение-concole из пользовательского действия установщика, чтобы сделать необходимые обновления для базы данных. Он хорошо работает

код для вызова консольного приложения из установщика:

public enum ReturnCode 
{ 
    Error = -1, 
    Updated = 0, 
    UpdateNotRequired = 1, 
    ServerNotAvailable = 2, 
    DatabaseNotAvailable = 3 
} 

private int UpdateSchema(string installationPath) 
{ 
    const string exeName = @"SchemaUpdater"; 

    string executablePath = Path.Combine(installationPath, exeName); 

    LogModule.Log_NewLogEntry("Starting Schema Updater"); 

    var myProcessStartInfo = new ProcessStartInfo(executablePath); 
    myProcessStartInfo.UseShellExecute = false; 
    myProcessStartInfo.CreateNoWindow = true; 

    Process process = Process.Start(myProcessStartInfo); 
    process.WaitForExit(); 

    int exitCode = process.ExitCode; 

    LogModule.Log_NewLogEntry(string.Format("SchemaUpdate returned {0}", exitCode)); 

    return exitCode; 
} 

public override void Install(IDictionary stateSaver) 
{ 
    string installationPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

    int dbUpdaterReturnVal = UpdateSchema(installationPath); 

    if (dbUpdaterReturnVal < 0) 
    { 
     throw new Exception("Schema Update returned with an error"); 
    } 

    if (dbUpdaterReturnVal == (int)ReturnCode.ServerNotAvailable) 
    { 
     throw new Exception("SqlServer Not available. Aborting Install"); 
    } 

    base.Install(stateSaver); 
} 
Смежные вопросы