2010-07-21 6 views
16

Nous utilisions WIX 3.5 (numéro de build 1811) et construisions une action personnalisée construite à l'aide de Visual Studio 2008 et avec un framework cible comme .Net 3.5. Cela fonctionnait très bien, jusqu'à ce que nous construisions l'action personnalisée en utilisant Visual Studio 2010 et avec le framework cible comme .Net 4.0.Les actions personnalisées WIX créées pour .Net Framework 4.0 ne fonctionnent pas? Des façons de résoudre?

WIX ne peut pas invoquer l'action personnalisée, l'erreur que nous obtenons est la suivante:

SFXCA: Extracting custom action to temporary directory: C:\Windows\Installer\MSI69BD.tmp-\ 
    SFXCA: Binding to CLR version v2.0.50727 
    Calling custom action SomeCompany.SomeProduct.InstallerPlugin!SomeCompany.SomeProduct.InstallerPlugin.XYZProductCustomAction.ABCMethod 
    Error: could not load custom action class SomeCompany.SomeProduct.InstallerPlugin.XYZProductCustomAction from assembly: SomeCompany.SomeProduct.InstallerPlugin 

    System.BadImageFormatException: Could not load file or assembly 'SomeCompany.SomeProduct.InstallerPlugin' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded. 

    File name: 'SomeCompany.SomeProduct.InstallerPlugin' 
     at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) 
     at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) 
     at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 
     at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 
     at System.AppDomain.Load(String assemblyString) 
     at Microsoft.Deployment.WindowsInstaller.CustomActionProxy.GetCustomActionMethod(Session session, String assemblyName, String className, String methodName) 
+0

Attendez-vous à ce que le 2.0 CLR puisse charger un assembly 4.0 et l'exécuter? –

Répondre

7

Eh bien nous avons finalement résolu le problème, nous avons dû mettre:

useLegacyV2RuntimeActivationPolicy="true" 
and 
have both versions specified: 
<supportedRuntime version="v2.0.50727"/> 
and 
<supportedRuntime version="v4.0"/> 

Si seulement "<supportedRuntime version="v4.0"/> est spécifié, il ne fonctionne pas. Cela ressemble donc à un bogue dans WIX 3.5 Beta

+1

Merci cela a aidé. Bien que dans mon cas, je n'avais pas besoin de l'élément v2 supportedRuntime. Avoir juste v4 a bien fonctionné. –

+2

Assurez-vous également de ne pas renommer le fichier CustomAction.config; sinon, les paramètres ne prendront pas effet. –

2

Il y a un bug ouvert à modifier l'élément DTF supportedRuntime dans son manifeste pour soutenir 4,0 netfx. Ce bug n'a pas encore été réparé, vous devez donc le faire vous-même.

1

En plus de la solution de Ngm, nous avons dû redéfinir le framework cible de la bibliothèque de classes d'actions personnalisées managée sur .NET 2.0 pour que les choses fonctionnent.

26

Juste mes deux cents:

Contrairement Ngm Je ne devaient ajouter supportedRuntime pour .NET 4.0

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

Important:

  1. Ne pas renommer CustomAction.config
  2. Définissez l'action de construction CustomAction.config sur Contenu, sinon cela ne fonctionnera pas
+8

Assurez-vous également de ne pas renommer CustomAction.config – Schalk

+2

Oui! Je vous remercie! Cela a réglé mon problème. L'action Build est incroyablement importante! Pourquoi n'est-ce pas plus important dans cette question? –

+3

J'étais curieux de savoir pourquoi CustomAction.config devait absolument être nommé ainsi. Dans la source WiX 3.7 de SfxCA.cpp, vous pouvez les voir en utilisant "CustomAction.config" comme une chaîne codée en dur. J'ai joué autour et il semble que vous pouvez nommer votre ensemble d'actions personnalisées, classe, fonctions et espaces de noms comme vous voulez, mais il doit avoir un fichier de configuration nommé exactement "CustomAction.config" défini sur Contenu. –

1

Merci pour ce bon post. C'est résolu ma requête. Dans mon cas, l'erreur était que j'ai renommé le fichier de configuration et maintenant restauré à l'original.

+0

C'est la seule chose que je devais faire et ça a marché. Je n'ai pas besoin de l'autre chose. – user145400

Questions connexes