如果Dll中有某个类的方法返回dynamic实例,并且dynamic对象实际实例为匿名类类型,则Dll的外部使用者可能最终无法正常使用此dynamic对象。当使用此dynamic对象时,可能会遇到x属性没有在object中定义的错误,此错误属于Microsoft.CSharp.RuntimeBinder.RuntimeBinderException实例——即使Debug时,能够看到返回的对象实例确实含有x属性。

这很诡异,返回匿名类,并用dynamic进行标示是节省代码量的利器。但在此处,运行时却无法发现动态的对象类型。经过多次试验,再说明一下会出现此问题的场景:

环境为.Net Framework 4.6 & Visual Stdio 2015 Community.

在Dll中定义类方法,并返回dynamic。实际返回类型为匿名类型。

/// <summary>
/// 类库工程
/// </summary>
namespace dynamicdll
{
public class Student
{
public static dynamic GenerateOne()
{
return new { No = "", Name = "Dong", Age = };
}

在Dll外部调用此方法,打印其属性值。DLL外部是指在DLL工程外部,而不是不同的命名空间。

namespace LimsTest
{
class Program
{
static void Main(string[] args)
{
var st = GenerateOne();
Debug.WriteLine($"{st.No},{st.Name},{st.Age}");

运行以上测试代码,出现错误。

测试方法:

  1. 在同一个.csproject中,相同的代码、使用方法不会出现此问题。
  2. 在dll项目内部使用,不会出现问题。
  3. 只有在dll中定义,外部使用才会出现问题。

可能的原因:

  1. 程序加载Dll的一些特殊之处。可能是AppDomain加载DLL的一些机制问题。
  2. 如果字段、方法参数或者返回值的类型是dynamic,编译器会将该类型转换为System.Object,并在元数据中向字段、参数或返类型应用System.Runtime.CompilerService.DynamicAttribute的实例。从上图的错误中可以看到返回的对象已经被转换为Object,但却没有能成功应用Runtime binding。外部调用后,Runtime没有找不到合适的、或者不知道如何在执行动态运行转换。如果跟踪调试,虽然可以看到类型为匿名类,并且拥有属性(值),但是运行会失败。

解决方案:

返回非dynamic对象。

不要使用匿名对象作为dynamic的返回值。使用确定的、在DLL中明确定义的类,返回dynamic不会出现错误。

总结:

不要在DLL中向其外部使用者返回实际类型为匿名类的dynamic对象实例。

Dll中的方法向外返回dynamic类型可能会失败的更多相关文章

  1. C#反射动态调用dll中的方法,并返回结果(转)

    反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...

  2. 使用clr 调用C#编写的dll中的方法的全解释

    使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...

  3. 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

    最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...

  4. 匿名类型 使用泛型T linq返回dynamic类型的匿名实体 如何把匿名类型.GetType()返回的对象传进泛型里面 EF实体查询出的数据List<T>转DataTable出现【DataSet 不支持 System.Nullable<>】的问题

    [100分]紧急求助:LinQ下使用IQueryable<T>如何将返回类型<T>使用匿名类型 问题描述如下:我有一个方法如下:public IQueryable Dissen ...

  5. 13 继续C#中的方法,带返回值的方法介绍

    在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) ...

  6. EF 6.x和EF Core实现返回dynamic类型

    前言 未曾想需要直接返回dynamic,多次尝试未能实现,最终还是在stackoverflow上找到了解决方案,特此备忘录. public static dynamic SqlQuery(this D ...

  7. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

  8. .NET Core 3.0 JsonSerializer.Deserialize 返回dynamic类型对象

    .NET Core 3.0 JsonSerializer.Deserialize to dynamic object 因为官方还不支持返回动态类型的对象,只能自己手写一个,临时测试了下没问题,还有些地 ...

  9. C#反射动态调用dll中的方法

    //加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...

随机推荐

  1. H5 坑

    document.addEventListener("touchmove",function(e){e.preventDefault();},false); 防止滑动时整屏页面移动 ...

  2. 解决ubuntu上opengl的问题

    装完ubuntu之后,对于opengl的程序总是出现问题,先将解决方案列出如下: http://www.linuxforums.org/forum/ubuntu-linux/175490-graphi ...

  3. 解释为什么word2vec也被称作deep learning

    作者:orangeprince链接:https://www.zhihu.com/question/27689129/answer/39117725来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  4. ipcs命令学习

    参考这篇 http://blog.csdn.net/pyjfoot/article/details/7989097 ipcs -m -s -q 分别对应集中ipc ipcs -l 显示limits: ...

  5. Retrofit网络框架入门使用

    1.简单介绍 retrofit事实上就是对okhttp做了进一步一层封装优化. 我们仅仅须要通过简单的配置就能使用retrofit来进行网络请求了. Retrofit能够直接返回Bean对象,比如假设 ...

  6. javascript 获取当前对象

    <a href="dsfjlsdjf" onclick="testGet()"> 请教编写testGet()函数获取这个超链接href属性,限制例如 ...

  7. Corona 不同设备分辨率适应

    移动平台下,不同设备的宽高比不同,那么必然存在与游戏设计时的宽高比不一致的情况,Corona的解决方案是定义了一个虚拟的屏幕高宽,比如1024*768,然后在不同设备上通过定义的适应模式去调整这个虚拟 ...

  8. Pig 在 shell script中被调用,批量载入处理文件

    首先,我想达到的目的是批量的处理一个目录下的的很多文档,这些文档保存了我要处理的数据,由于pig是初学..所以不知到该怎么批量的load,没有写过 自己的UDF,仅仅能一个一个文件的load,然后处理 ...

  9. 启动VIP报CRS-1028/CRS-0223致使VIP状态为UNKNOWN故障分析与解决

    CRS版本号为10.2.0.4 1.VIP State为UNKNOWN [root@XXdb1 ~]# crs_stat -t Name           Type           Target ...

  10. HDU 2110-Crisis of HDU(母函数)

    Crisis of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...