考虑用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
当在单独的程序集中定义类X
和TestIPY
时,我才会收到此错误。当代码在同一个程序集中定义时,代码可以正常工作。
当类包含在单独的程序集中时,为什么它不起作用?
我想这个问题与我去年报道的这个问题有些相关: 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中的错误。
答案 0 :(得分:2)
如果程序集FirstAssembly.dll
位于文件夹SomeFolder
和SomeOtherFolder
中,则会出现此问题。因为在这种情况下,X
类型被加载了两次,而且它与foo
的签名不再匹配。