加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 代码合同重写失败,“无法解析成员引用”

发布时间:2020-12-15 07:57:11 所属栏目:百科 来源:网络整理
导读:请注意,这可能是 this question的重复,我不完全确定. 我的问题是我有一个类库项目,它引用了第三方类型库(COM).我想将契约放入类库中的方法,如下所示: public class foo{ public static int divide(TypeFromTypeLib tftl,int a,int b) { Contract.RequiresAr
请注意,这可能是 this question的重复,我不完全确定.

我的问题是我有一个类库项目,它引用了第三方类型库(COM).我想将契约放入类库中的方法,如下所示:

public class foo
{
    public static int divide(TypeFromTypeLib tftl,int a,int b)
    {
        Contract.Requires<ArgumentException>(b != 0);
        return a / b;
    }
}

然后让客户项目使用这种方法,例如

var n = foo.divide(null,4,2);

但我也希望客户端项目在其某些方法中也使用契约.因此,我将两个项目的Code Contracts属性设置为’Perform Runtime Contract Checking'(没有它,你得到运行时断言告诉你它需要这个设置).

现在,当我尝试编译客户端时,我收到以下错误:

Could not resolve member reference: my_class_lib.foo::divide.

ccrewrite : error : Rewrite aborted due to metadata errors.

这似乎是不可避免的 – 任何时候调用一个类型来自第三方类型库的方法.从方法的签名中删除类型,没关系.

谁能解释为什么会这样?这是一个线索,我的代码结构从根本上是有缺陷的(如果是这样,为什么?),或者它是代码合同的怪癖?是否有针对此问题的建议修复程序?

解决方法

说实话,我不知道为什么ccrewrite有interop类型的问题,但我可以给你3个解决方法:

解决方案1

这个是最简单的:

>转到项目的参考列表.
>查找第三方类型库.
>右键单击.
>从上下文菜单中选择“属性”.
>将Interop类型从True更改为False.

你必须为这两个项目做到这一点.此解决方案的缺点是,在构建之后,您将在bin文件夹中获得额外的互操作程序集.

解决方案2

另一种解决方案可能是从公共接口中删除第三方类型库中的类型,即:

public class foo
{
    public static int divide(int a,int b)
    {
        return divide(null,a,b);
    }

    private static int divide(TypeFromTypeLib tftl,int b)
    {
        Contract.Requires<ArgumentException>(b != 0);
        return a / b;
    }
}

当然,只有在客户端不需要使用TypeFromTypeLib时才能这样做.

解决方案3

如果您需要在客户端使用TypeFromTypeLib,您可以为此类编写一个包装器,即:

public class MyTypeFromTypeLib
{
   //...
}

public class foo
{
    public static int divide(MyTypeFromTypeLib mytftl,int b)
    {
        var tftl = new TypeFromTypeLib();
        //Map MyTypeFromTypeLib  to TypeFromTypeLib 
        //...
        return divide(tftl,int b)
    {
        Contract.Requires<ArgumentException>(b != 0);
        return a / b;
    }
}

但是,这种解决方案很麻烦,因为需要额外的类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读