无法调用带有在不同程序集中定义的类型的参数的函数

时间:2016-01-08 16:26:42

标签: c# .net assemblies ironpython

考虑用C#编写的2个程序集。第一个程序集的代码是:

namespace VSInterface
{
    public class X
    {

    }
}

第二个程序集的代码是:

namespace VSInterface
{
    public class TestIPY
    {
        public static void foo(X bar)
        {

        }
    }
}

当我从以下IPY代码调用函数foo时:

import clr
clr.AddReferenceToFileAndPath(r"SomeFolder\FirstAssembly.dll")
clr.AddReferenceToFileAndPath(r"SomeOtherFolder\SecondAssembly.dll")

from VSInterface import TestIPY, X

TestIPY.foo(X())

我收到错误:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
TypeError: expected X, got X

当在单独的程序集中定义类XTestIPY时,我才会收到此错误。当代码在同一个程序集中定义时,代码可以正常工作。

当类包含在单独的程序集中时,为什么它不起作用?

我想这个问题与我去年报道的这个问题有些相关: IronPython: How to call a function that expects an array of value-types?

我放弃了搜索链接问题的解决方案,因为我认为LabView有一些有趣的东西。但是,现在我想与我自己的C#代码接口,我得到一个类似的(相同的?)错误。

2016年12月1日更新 不幸的是,这个问题并没有完全解决。当SomeOtherFolder包含FirstAssembly.dll的副本时,会出现此问题。通过从FirstAssembly删除SomeOtherFolder,可以轻松解决此问题。 然而,如果SomeFolder(我意识到我应该选择更好的目录名...)是相对路径,则会出现问题 。这对我来说是一个问题因为我必须为我的项目使用相对路径。我可以通过使用以下代码导入程序集来避免此问题:

import clr
import os
clr.AddReferenceToFileAndPath(os.path.abspath(r"SomeFolder\FirstAssembly.dll"))

我真的不明白为什么在使用相对路径时它不起作用,我不确定这是否是IronPython中的错误。

1 个答案:

答案 0 :(得分:2)

如果程序集FirstAssembly.dll位于文件夹SomeFolderSomeOtherFolder中,则会出现此问题。因为在这种情况下,X类型被加载了两次,而且它与foo的签名不再匹配。