How to use a C# dll in IronPython
Asked Answered
B

6

17

I have created a dll using C#. How do use the dll in IronPython. I have tried to add the dll using clr.AddReference("yxz.dll"). But it fails. I have tried placing the dll in the execution directory of the IronPython script. Still it fails stating that "Name xyz cannot be found" while trying to refer the dll.

Bracteole answered 29/7, 2009 at 13:16 Comment(3)
What happens if you change the line to clr.AddReference("yxz"), does that make any difference?Macgregor
If the problem is that the DLL can't be found, use Process Monitor by Sysinternals to pinpoint what's wrong.Devisor
fuslogvw.exe is also a good way to figure out why a managed DLL isn't found - it comes w/ the platform SDK.Redo
B
14
import clr    
clr.AddReferenceToFileAndPath(r"C:\Folder\Subfolder\file.dll")

is the simplest way as proposed by Jeff in the comments. This also works:

import clr
import sys

sys.path.append(r"C:\Folder\Subfolder")  # path of dll
clr.AddReference ("Ipytest.dll") # the dll
import TestNamspace  # import namespace from Ipytest.dll
Bunkhouse answered 8/1, 2013 at 8:24 Comment(4)
You can also use clr.AddReferenceToFileAndPath, which does exactly that.Eldaelden
I get this behaviour only from the IronPython console. When I run a script it is fine. When I run a script the IronPython, sys.path contains an absolute path to my current working directory so it works. When I type in the console, sys.path only includes a '.' for the current working directory. That may explain the difference in behaviour.Miso
I tried this, but getting an error: AttributeError: 'module' object has no attribute 'AddReferenceToFileAndPath'Sanyu
The dll in clr.AddReference() should be without the .dll extensionMending
M
9

I think it's failing to find the file because it doesn't know where to look for it, see here for a detailed explanation as to how the clr.AddReference...() functions work.

Macgregor answered 29/7, 2009 at 13:27 Comment(0)
U
4

The Creating .NET Classes Dynamically from IronPython example, creates an assembly (which is later saved to disk as "DynamicAsm.dll"). It contains a class called "DynamicType", with a single static method called 'test'. This method takes four integers and adds them together.

The nice thing is that this saves "DynamicAsm.dll" to disk. You can then start an IronPython interactive interpreter session and do the following :

>>> import clr
>>> clr.AddReference('DynamicAsm.dll')
>>> import DynamicType
>>> DynamicType.test(2, 3, 4, 5)
14

Note that the example uses the class name in the import statement.

Unbuckle answered 29/7, 2009 at 13:45 Comment(2)
use import sys print sys.path to determine where clr.AddReference is looking for dllsMnemonic
Can I actually do this from the outside? Or do I really have to import clr and add the reference to the assembly in my IronPython script? I've got some assemblies here that I'd like to have imported statically so that they are always available in the script.Moneywort
C
1

You can use this:

import clr 
clr.AddReferenceToFile("yxz.dll")
Christiano answered 17/1, 2013 at 5:19 Comment(0)
W
0

It's better to use clr.AddReferenceToFile(filename) , because it takes a relative path.

import clr 
clr.AddReferenceToFile("xxx.dll")

Then you can import the classes by import as usual:

import xxx

or

from xxx import *

I recommend you to check out this book , it's very helpful. https://play.google.com/store/apps/details?id=com.gavin.gbook

Witchcraft answered 24/8, 2014 at 1:9 Comment(1)
AddReferenceToFileAndPath also works with relative directory paths, fwiw.Zymolysis
M
0

I got this behaviour only from the IronPython console. When I run a script it is fine. When I run a script the IronPython, sys.path contains an absolute path to my current working directory so it works. When I type in the console, sys.path only includes a '.' for the current working directory. That may explain the difference in behaviour.

As a bit of a hacky solution, I created a file fixpath.py

"""This hacky script fixes the sys.path when I run the ipy console."""

import sys
import os

sys.path.insert(0, os.getcwd())

del sys
del os

Then I set up an environment variable IRONPYTHONSTARTUP with the absolute path to this file. Then whenever I start my IronPython console, this script is run and my sys.path includes an absolute reference to my current working directory and the subsequent calls to clr.AddReference work properly.

Miso answered 27/7, 2015 at 15:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.