web-dev-qa-db-fra.com

CSC: erreur CS7038: impossible d'émettre le module

Après l'installation de Visual Studio 2015 et la construction de mon projet, le message d'erreur s'affiche.

"CSC: erreur CS7038: Échec de l'émission du module". 

Cependant, ma solution fonctionne correctement dans Visual Studio 2013.

C'est un projet de formulaires Web ASP.NET .NET 4.0

N'importe qui?

UPDATE: il semble que le problème concerne le Red Gate Smart Assembly associé à des paramètres de méthode avec des valeurs par défaut.

UPDATE: Smart Assembly 6.9 corrige l'erreur pour moi.

23
Orlando Helmer

Vous avez la même erreur (nouvelle installation de VS2015 Enterprise, projet de formulaires Web ASP.NET .NET 4.0).

Après une enquête, j'ai constaté qu'il existe deux DLL dans les références qui provoque cela. Les deux sont des assemblages .Net 2.0 et tous deux obscurcis par Red Gate Smart Assembly 6.5 . Et la vraie raison est ... obfuscation .

Heureusement, ces assemblages sont les miens, j'ai donc essayé de les construire sans utiliser d'assemblage intelligent - l'erreur est partie.

Il est intéressant de noter qu'aucune des erreurs ou des avertissements affichés par Visual Studio avant d'essayer de générer un projet.

Bonne chance!

EDIT: La mise à jour de Smart Assembly vers la version 6.9 a résolu un problème.

7
Andrey Ivashov

Extrait original:

    private void radButton1_Click(object sender, EventArgs e)
    {
        string perp = radTextBox1.Text;

        int i = 0;
        DataRow arp = ale.Rows[i];
        while (i <= ale.Rows.Count)
        {
            if (ale.Rows[i].Field<>("FullName") = perp)
            {
                arp = ale.Rows[i];
                ale.Rows.Remove(arp);
            }

        }

        i = ale.Rows.Count;
        radLabel1.Text = i.ToString();
    }

Changé ceci:

    if (ale.Rows[i].Field<>("FullName") = perp)

Pour ça:

    if (ale.Rows[i].Field<String>("FullName") == perp)
12
Scooter

Comme @Andrey a signalé que cela semble être un problème avec les assemblages obfusqués qui cause quelques difficultés pour Roslyn. Aujourd'hui, j'ai pu obtenir une reproduction en direct de cette erreur et la cause première semble être l'obscurcisseur invalide/altère la manière dont les valeurs de paramètre par défaut sont stockées dans les métadonnées. Lorsqu'il est exécuté via ildasm, les valeurs par défaut seront affichées comme suit:

.param [3] /* Invalid default value for 0800001F: */

La version précédente du compilateur a géré ce scénario en traitant la valeur non valide comme étant null ou default(T). Nous allons corriger le comportement de Roslyn. 

6
JaredPar

J'ai également eu cette exception levée dans VB.NET (Visual Studio 2015 - Pro) et isolé une seule ligne à l'origine de l'erreur. 

Dans la ligne de code ci-dessous, si vous définissez model comme un entier, comme dans:

Dim model as Integer = 2

et ensuite utiliser:

Const N As Integer = model

vous allez lancer l'exception.

Cependant, quand j'ai modifié ceci pour: 

Dim N As Integer = model

l'exception n'a pas été levée. La syntaxe de Const était le code hérité d'un autre programme auquel j'ai rapidement ajouté un modèle, et les constantes ne peuvent pas être définies sur des types entiers prédéfinis. 

5
4k3x9d7r

Répondant à la réponse de @ jony-adamit}:

J'ai également eu cette erreur de compilation en C # (Visual Studio 2015). Cela résultait des différences dans la sortie du compilateur de .NET 4.5 et du nouveau compilateur Roslyn dans VS2015. Vous pouvez prendre le code ci-dessous et l'exécuter vous-même ou utiliser dotnetfiddle ( https://dotnetfiddle.net/fa2rMs ) et basculer entre les compilateurs.

Dans le compilateur .NET 4.5 (compilateur C # version 12.0 ou antérieure), vous obtenez le message suivant:

Erreur de compilation (ligne 16, col 7): nom du type ou de l’espace de nom 'Select' n'existe pas dans l'espace de noms 'Tools.Weapons' (manque-t-il une référence d'assembly?)

Dans les versions de compilateur Roslyn 1.0.0 et 1.1.0, vous obtenez ce message:

Erreur de compilation (ligne 1, colonne 1): Échec de l’émission du module 'Mon Assemblage'.


Code pour reproduire l'erreur (notez l'espace de nom):

public class Program
{   
    public static void Main()
    {
        Tools.Delegater.Work();
    }
}

namespace Tools 
{
    public static class Delegater
    {   
        public static System.Action Work = () => 
        {
            var query = from x in Weapons
                        select x;
        };
    }
}

namespace Tools.Weapons
{
    public class Cannon { }
}

Comme vous pouvez le constater à partir des messages du compilateur, le message de Roslyn vous laisse deviner quant au quoi et à l'endroit de l'erreur du compilateur. Et selon la taille de l'application, le manque de détails peut prendre des jours ou des semaines pour en découvrir la cause. Tandis que le message du compilateur précédent vous indiquait l’endroit exact pour commencer à examiner votre code.

Une autre grande différence est que le compilateur précédent vous montrera une erreur de syntaxe dans Visual Studio pour ce scénario, mais malheureusement, Roslyn (atm) ne le fait pas. Cependant, si vous saviez où regarder et que vous survoliez la variable 'x' dans l'instruction linq to sql avec votre souris, vous verriez alors que Rosyln ne comprend pas comment l'interpréter.

3
ntieszen.pro

J'avais une erreur similaire: "BC36970. Echec de l'émission du module 'Something.dll'." Je réalise que le code d'erreur n'est pas le même, mais qu'il s'agit également d'un problème du type "Echec à l'émission" partagerais ma réponse. 

Problème: Mon problème était que j'avais une chaîne qui était une constante mais j'essayais de lui ajouter une autre chaîne, comme ceci (avec du code VB):

Dim MyString1 As String = "Test1"
Const MyString2 As String = "Test2" & MyString1

Solution: Je devais simplement convertir la deuxième chaîne de Const en Dim et l'erreur disparut:

Dim MyString1 As String = "Test1"
Dim MyString2 As String = "Test2" & MyString1
3
Hank Scorpio

Je viens d'avoir "Impossible d'émettre le module". J'ai mis par erreur des crochets vides dans un appel à une méthode d'extension générique, uniquement à l'intérieur d'un opérateur ternaire, comme ceci:

var a = b == 6 ? 8 : x.Foo<>();

(En dehors d’une opération ternaire, j’obtiens l’erreur habituelle CS7003: Utilisation inattendue d’un nom générique non lié.)

2
Eldritch Conundrum

Il y a un autre bug qui peut causer cette erreur exacte:

Cela m’est arrivé après la modification d’un nom de propriété sans refactoring, ce qui a amené certains codes linq à appeler le namespace!

Pour voir le bogue en action, tout ce que vous avez à faire est d’exécuter ce morceau de code:

public static int Test()
{
    var x = from c in ConsoleApplication5
        select 3;

    return x.First();
}

ConsoleApplication5 est l'espace de noms!
Cela ne se produit que dans VS2015.

Mettre à jour:
Il y a un numéro pour cela maintenant sur GitHub si quelqu'un est intéressé.

1
Jony Adamit

J'ai eu cette erreur lorsque je travaillais avec la table de données et je n'ai pas fourni le type de données requis:

bool temp = dtTab.AsEnumerable().Any(row => row.Field<>("active") == 1);

En lui donnant un type de données approprié, nous avons éliminé l'erreur. Je devais aussi le convertir en chaîne pour pouvoir le comparer correctement-

bool temp = dtTab.AsEnumerable().Any(row => row.Field<Boolean>("active").toString() == "1");
1
Pallavi

J'obtiens la même erreur "Impossible d'émettre le module" avec ce code mais changer le "Const" en "Dim" résout le problème:

Dim userStatus1 As String = convAttrSet("user_status")
Dim userStatus2 As String = convAttrSet("user_status")
Const PENDING As Boolean = (userStatus1 = userStatus2)
1
energyplay

Cette réponse est similaire à celle publiée par @wrtsvkrfm

  'Dim NEWLINE As String = "<BR/>"
   Dim NEWLINE As String = vbCrLf

 Const HT_QTC_VENDOR As String = "<B>some stuff {0}</B>" & NEWLINE

Cela fera que la DLL ne sera pas émise, 

Changez les 2 premières lignes en 

  'Const NEWLINE As String = "<BR/>"
   Const NEWLINE As String = vbCrLf

et l'erreur s'en va. Cela devrait être une erreur de compilation. A CONST ne peut clairement dépendre d’une variable, qui peut, bien, varier. :-)

1
greg

J'ai eu cette erreur en utilisant une méthode générique mais en n'incluant pas le type.

Ce code a donné l'erreur:

example.GetValue<>(foo);

La correction consistait simplement à spécifier le type:

example.GetValue<string>(foo);

Je ne sais pas si l'exemple d'erreur est une syntaxe valide ou non: j'aurais attendu une erreur de syntaxe si ce n'était pas plutôt cette erreur, et Intellisense a accepté la syntaxe.

1
Hutch

J'ai aussi cette erreur, il semble y avoir quelques raisons majeures qui causent cette erreur.

J'ai posté cette réponse pour résumer les solutions mentionnées et aider les autres gars à résoudre rapidement cette erreur}

Veuillez lire attentivement toutes les réponses ici sur cette page, je suis sûr que vous pouvez résoudre le problème en utilisant l'une des solutions mentionnées, bonne chance :)

1
Mehdi Dehghani

Raison: Cette erreur semble être introduite lorsque nous avons quelque chose de bizarre dans notre code. Pour moi, j'ai commis une erreur en obtenant l'identité de l'utilisateur actuel.

Code d'erreur: Int currentUserId = User.Identity.GetUserId <> ();

Code fixe: Veuillez spécifier le type de données après GetUserID <----------> (); Dans ce cas, j’ai spécifié int.

Remarque Essayez d’annuler votre code étape par étape afin de résoudre ce problème. Mais sinon, il était très difficile pour moi de suivre cette erreur.

Merci

0
yuvaraj prabhu

Pour moi, le problème est survenu après l’ajout d’une étape de post-génération qui modifie le fichier assemblyinfo.cs (Net Revision Tool.exe) . Veillez à ne pas modifier le fichier AssemblyInfo.cs entre bâtiment et Edition et à continuer.

0
codingdave

J'ai eu cette erreur lors de l'utilisation de linq avec des entités et ma requête linq avait une erreur de syntaxe dans la clause join

0
Jay Jay Jay

J'ai également eu cette exception levée dans VB.NET (Visual Studio 2015 - Pro) et isolé une seule ligne qui causait l'erreur

     Faulty....
    Dim i As Short
    Dim j As Short = BancoCombienElement(LaChaine)
    Const a  = (22 / 60) * j
    Dim TiTxt As String = ""
    Dim S_8_10_12_14 As String = ""

    Work good!!!!!!!!
    Dim i As Short
    Dim j As Short = BancoCombienElement(LaChaine)
    Dim a As Short = (22 / 60) * j
    Dim TiTxt As String = ""
    Dim S_8_10_12_14 As String = ""
0
guest