为什么我不能将我的C#类型导入IronPython?
我在我编写的C#库中有一些类型,例如:
namespace SprocGenerator.Generators { public class DeleteGenerator : GeneratorBase { public DeleteGenerator(string databaseName, string tableName) : base(databaseName, tableName)
我想在IronPython脚本中使用它们:
import clr import sys clr.AddReferenceToFile("SprocGenerator.dll") # problem happens here: from SprocGenerator.Generators import * generator = DeleteGenerator("a", "b")
当评论下面的行发生时,我得到:
ImportError: No module named Generators
我已经validation了我正在加载的文件是我期望的重命名它并且在尝试加载程序集时validation脚本会引发错误。 我通过Reflectorvalidation了命名空间在程序集中。 我还尝试指定一个完全限定的类名来解决我的导入问题,例如
generator = SprocGenerator.Generators.DeleteGenerator("a", "b")
但我得到:
NameError: name 'SprocGenerator' is not defined
即使我在C#中有这个:
namespace SprocGenerator { public static class GeneratorHelper { public static string GetTableAlias(string tableName)
这在IP中:
import clr import sys from System import * clr.AddReferenceToFile("SprocGenerator.dll") from SprocGenerator import * print "helper = " + GeneratorHelper.GetTableAlias("companyBranch")
我收到此错误:
NameError: global name 'GeneratorHelper' is not defined
我究竟做错了什么?
您是否可以从其他位置获取DLL然后您期待? AddReferenceToFile将搜索sys.path并加载它找到的与该文件名匹配的第一个文件。 根据您希望找到DLL的位置以及路径上可能存在的位置,您可能会获得之前编译的版本。 你也可以这样做:
dir(clr.LoadAssemblyFromFile('SprocGenerator.dll'))
查看您实际获得的DLL中存在哪些类型或:
clr.LoadAssemblyFromFile('test.dll').CodeBase
查看文件实际加载的位置。
检查您的命名空间。 它抱怨的事实是:
ImportError: No module named Generators
代替:
ImportError: No module named SprocGenerator.Generators
告诉我们它找到了SprocGenerator命名空间。 内部名称空间中的C#或Python是否存在拼写错误?
将程序集放在sys.path中指定的其中一个位置。 在我的机器上:
[‘C:\ Windows \ system32’,’C:\ Program Files(x86)\ IronPython 2.6 \ Lib’,’C:\ Program Files(x86)\ IronPython 2.6 \ DLLs’,’C:\ Program Files(x86) )\ IronPython 2.6’,’C:\ Program Files(x86)\ IronPython 2.6 \ lib \ site-packages’]