为什么我不能将我的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’]