Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException "An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)"

J'ai identifié un vilain bug quand on mélange les IQueryable et la syntaxe yield.

J'avais réalisé un exemple avec LINQ To SQL, un autre avec LINQ To Entities et enfin un autre avec IEnumerable<object> (qui lui ne plante pas). Diego a transformé mon exemple IEnumerable<object> en IQueryable<object> avec l'extension method AsQueryable afin de confirmer que le problème venait bien du mélange IQueryable et la syntaxe yield et était indépendant de la version de LINQ utilisé. Voilà donc l'exemple final qu'il a transmis à l'équipe C# :

class Program

{

    static void Main(string[] args)

    {

        try

        {

            GetCategoryProductsUsingQueryable(() => new MyProduct(), 1).ToList();

            Console.WriteLine("Queryable succeeds");

        }

        catch (Exception e)

        {

            LogException(e);

        }

    }

 

    private static void LogException(Exception e)

    {

        Console.WriteLine(e.GetType());

        Console.WriteLine(e.Message);

    }

 

    private static List<Category> Categories =

        new List<Category> {

            new Category {

                CategoryID = 1,

                Products = new List<Product> {

                    new Product {

                        ProductID = 1 } } } };

 

 

    static IEnumerable<P> GetCategoryProductsUsingQueryable<P>(Func<P> newP, int categoryId) where P : IProduct

    {

        var categ = Categories.AsQueryable().FirstOrDefault(c => c.CategoryID == categoryId);

        if (categ == null)

            yield break;

        foreach (var p in categ.Products)

            yield return Load(newP(), p);

    }

 

    static P Load<P>(P item, Product p) where P : IProduct

    {

        item.ID = p.ProductID;

        return item;

    }

}

 

public interface IProduct

{

    int ID { get; set; }

}

 

public class MyProduct : IProduct

{

    public int ID { get; set; }

}

 

public class Category

{

    public int CategoryID { get; set; }

    public List<Product> Products { get; set; }

}

public class Product

{

    public int ProductID { get; set; }

}

Dans ce cas, la console affichera :

System.BadImageFormatException
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mardi 14 octobre 2008 07:48 par Matthieu MEZIL

Classé sous : , , ,

Commentaires

# re: Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException &quot;An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)&quot; @ mardi 14 octobre 2008 11:21

Une repro plus simple:

http://monoport.com/37719

Le problème vient du fait que csc ne mute pas le contenu de l'expression tree lors de l'extraction du code de la méthode vers le MoveNext du type généré. On se retrouve donc avec une référence vers un argument générique de méthode (!!0) au lieu d'un argument générique de type (!0), ce qui est invalide dans ce contexte.

Marrant, chez Mono, gmcs n'a pas ce problème lui, mais ce teste montre un bug dans mon implémentation des expression tree. Comme quoi...

Jb Evain

# re: Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException &quot;An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)&quot; @ mardi 14 octobre 2008 11:40

Que dis-je, c'est bien notre compilo qui a aussi un problème, mais au niveau de l'Expression Tree lui. L'honneur est sauf.

Jb Evain

# re: Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException "An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)" @ mardi 14 octobre 2008 14:19

C'est marrant de voir à quel point il est satisfaisant de s'apercevoir que le bug ne vient pas de son code Wink

Matthieu MEZIL

# re: Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException "An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)" @ mardi 14 octobre 2008 14:37

En tout cas, on vient de corriger notre compilo, qui marche bien avec ta repro.

Jb Evain

# re: Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException "An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)" @ mardi 14 octobre 2008 14:54

Cool !

Je n'aurais jamais cru avoir un impact sur mono. Smile

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01