2009-11-19 110 views
5

我有一个C#库我写了一些类型,例如:为什么我不能将我的C#类型导入IronPython?

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 

我核实,我加载该文件是什么,我希望通过重命名它和验证脚本引发试图加载程序集时出错。我已经通过反射器验证了该组件中的名称空间。我也尝试指定一个完全合格的类名来解决我的导入问题,例如

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 

我在做什么错?

+2

什么平台是SprocGenerator.dll内置的?难道问题是运行IronPython程序的过程无法处理DLL的“体系结构”?例如,如果您从32位控制台运行IronPython,并且SprocGenerator.dll是为64位构建的。 – Jacob 2009-12-10 19:46:25

+1

@Jacob - 这正是我遇到的问题。使用我的python解释器的32位版本修复了它。 – arviman 2012-01-24 20:07:04

回答

1

检查您的命名空间。它抱怨一个事实:

ImportError: No module named Generators 

代替:

ImportError: No module named SprocGenerator.Generators 

告诉我们,它找到了SprocGenerator命名空间。在内部命名空间Generators中,C#或Python中是否存在拼写错误?

+0

程序集的默认命名空间设置是否对我的问题有影响?它被设置为默认值:“SprocGenerator” – 2009-11-19 20:03:51

+0

我不这么认为。默认的命名空间只是告诉Visual Studio如何生成新的代码文件。无论采用哪种方式,Reflector都会向您显示找到该类的名称空间。我精确地复制了你的例子,当我改变命名空间与你显示的不同时,我只会得到一个错误。 =/ – 2009-11-19 20:09:20

+0

IronPython 2.0.3? – 2009-11-19 20:11:19

5

你可以从不同的位置拾取DLL,然后你期待? AddReferenceToFile将搜索sys.path并加载它找到的与该文件名匹配的第一个文件。根据你期望找到DLL的位置以及它可能存在于路径前面的位置,你可能会得到一个你之前编译过的版本。你也可以这样做:

dir(clr.LoadAssemblyFromFile('SprocGenerator.dll')) 

看到你实际上找回或DLL什么类型的存在:

clr.LoadAssemblyFromFile('test.dll').CodeBase 

,看看那里的文件实际上正在从加载。

0

将程序集放置在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']

相关问题