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

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 6 heures et 6 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59