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

标签 c# vb.net

我使用的是 vb.net 2013。 我尝试使用通过 NUGET 安装的工具。 EntityFramewrok.Utilities/链接: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文件后,现在错误信息消失了。 但是谁能确认这是一个正确的解决方案?

最佳答案

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

这可以解释为什么原始 DLL 无法工作,而您重建的 DLL(使用在 VS.NET 2013 中为您的项目定义的相同 .NET“目标框架”)却可以工作。

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

关于c# - 在 vb.net 项目上使用时,C# DLL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287088/

相关文章:

vb.net - VB 和 Aspose 的问题

c# - 停止自动隐藏托盘通知图标

ASP.NET 动态数据以只读方式运行?

C#:通过内联对象实例化直接设置子类属性

c# - 为什么 Windows.Forms.TreeView 没有 SelectedNodeChanged 事件?

c# - 在 WPF 中创建自定义表单?

asp.net - window.returnValue 属性允许的最大长度是多少? (JavaScript)

c# - 获取页面的url

c# - 创建 MVVM 搜索页面 Xamarin

c# - 对大型解决方案、IOC、Moq 进行改造单元测试