在vb.net项目上使用时,C#DLL不起作用

时间:2015-02-02 21:27:53

标签: c# vb.net

我正在使用vb.net 2013。 我尝试使用我使用NUGET安装的工具。 EntityFramewrok.Utilities / link:https://github.com/MikaelEliasson/EntityFramework.Utilities 这是一个开源的DLL,可以下载整个代码。 从这个DLL,我试图使用" IncludeEFU"方法。 在上面的链接中,是我在C#项目上使用的代码并且有效:

var result = db.Contacts
.IncludeEFU(db, x => x.PhoneNumbers
.Where(n => n.Number == "10134")
.OrderBy(p => p.ContactId)
.ThenByDescending(p => p.Number))
.ToList();

我尝试在我的VB.net应用程序上使用相同的代码:

Dim result = db.Contacts _
.IncludeEFU(db, Function(x) x.PhoneNumbers _
.Where(Function(n) n.Number = "10134")_
.OrderBy(Function(p) p.ContactId) _
.ThenByDescending(Function(p) p.Number)).ToList()

但是我收到了错误:

An unhandled exception of type 'System.ArgumentException' occurred in     EntityFramework.Utilities.dll

Additional information: Could not find a MemberExpression

逐个检查dll项目中的文件(可以在链接上下载),我看到我收到的错误信息来自此子目录:

private static PropertyInfo SetCollectionModifiersAndGetChildProperty<T, TChild>(Expression<Func<T, IEnumerable<TChild>>> collectionSelector, List<MethodCallExpression> childCollectionModifiers)
        where T : class
        where TChild : class
    {
        var temp = collectionSelector.Body;
        while (temp is MethodCallExpression)
        {
            var mce = temp as MethodCallExpression;
            childCollectionModifiers.Add(mce);
            temp = mce.Arguments[0];
        }
        childCollectionModifiers.Reverse(); //We parse from right to left so reverse it
        if (!(temp is MemberExpression))
        {
            throw new ArgumentException("Could not find a MemberExpression", "collectionSelector");
        }

        var childProp = (temp as MemberExpression).Member as PropertyInfo;
        return childProp;
    }

看看这一行:

throw new ArgumentException("Could not find a MemberExpression", "collectionSelector");

为什么这会在C#项目上运行,并在VB.net项目中产生这个错误? 我该如何解决这个问题? 谢谢!

编辑:我尝试在该子目录中进行一些更改:

    ...

    while (temp is MethodCallExpression)
            {
                var mce = temp as MethodCallExpression;
                childCollectionModifiers.Add(mce);
                temp = mce.Arguments[0];
            }
        while (temp is UnaryExpression)
        {
            var ue = temp as UnaryExpression;
            temp = ue.Operand;
        }
        .....

重建dll文件后,现在错误消息消失了。 但任何人都可以确认这是一个正确的解决方案吗?

2 个答案:

答案 0 :(得分:1)

最初的EntityFramework.Utilities DLL可能是使用与VB.NET应用程序不同的.NET“目标框架”构建的。

这可以解释为什么原始DLL在您重建的DLL(使用在VS.NET 2013中为您的项目定义的相同.NET“目标框架”)确实有效时不起作用。

要检查VS.NET的“目标框架”,请右键单击解决方案资源管理器中的适用项目,然后单击“属性”选项。 “应用程序”选项卡将显示“目标框架:”标签,其中包含可用的.NET Framework版本号的下拉输入。此下拉列表的当前设置是.NET“目标框架”,用于在VS.NET 2013中进行构建。

答案 1 :(得分:0)

此错误是因为VB和C#表达式树具有不同的结构。我想假设它们会一样,所以VB现在不能正常工作。希望我能尽快修建新版本。