我在我编写的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
我已经验证了我正在加载的文件是我期望的重命名它并且在尝试加载程序集时验证脚本会引发错误。我已通过Reflector验证了命名空间在程序集中。我还尝试指定一个完全限定的类名来解决我的导入问题,例如
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
我做错了什么?
答案 0 :(得分:5)
您是否可以从其他位置获取DLL然后您期待? AddReferenceToFile将搜索sys.path并加载它找到的与该文件名匹配的第一个文件。根据您希望找到DLL的位置以及路径上可能存在的位置,您可能会获得之前编译的版本。你也可以这样做:
dir(clr.LoadAssemblyFromFile('SprocGenerator.dll'))
查看您实际获得的DLL中存在哪些类型或:
clr.LoadAssemblyFromFile('test.dll').CodeBase
查看文件的实际加载位置。
答案 1 :(得分:1)
检查您的命名空间。它抱怨的事实:
ImportError: No module named Generators
而不是:
ImportError: No module named SprocGenerator.Generators
告诉我们它找到了SprocGenerator命名空间。内部命名空间中的C#或Python中是否存在拼写错误,Generators?
答案 2 :(得分:1)
将程序集放在 sys.path 中指定的其中一个位置。在我的机器上:
['C:\ Windows \ system32','C:\ Program 文件(x86)\ IronPython 2.6 \ Lib', 'C:\ Program Files(x86)\ IronPython 2.6 \ DLLs','C:\ Program Files(x86)\ IronPython 2.6','C:\ Program 文件(x86)\ IronPython 2.6 \ lib中\站点包]