[Python.NET] How to create an instance of C# from pythonnet?
Seungweon Park
swpark71 at gmail.com
Fri Apr 19 19:45:34 CEST 2013
Thank you for the replies.
Now, I recompiled Python.Net with .Net 4.0 and get below working with
simple AAA.BBB.Adapter after reading
http://stackoverflow.com/questions/14520888/clr-addreferenceexample-file-unable-to-find-assembly?rq=1
http://stackoverflow.com/questions/13259617/python-for-net-unable-to-find-assembly-error?rq=1
http://sourceforge.net/p/pythonnet/bugs/17/
http://sourceforge.net/p/pythonnet/bugs/18/
Now I have below sample code(Adapter.proj has two c# files), and
experimented
Class1.cs
-----------
namespace AAA.BBB.CCC
{
public class Adapter
{
public string Function1()
{
return "AAA.BBB.CCC: Adapter Function1 Called";
}
public void Function2()
{
Console.WriteLine("AAA.BBB.CCC: Adapter Function2");
}
}
public class Network
{
public string Function1()
{
return "AAA.BBB.CCC: Network Function1 called";
}
public void Function2()
{
Console.WriteLine("AAA.BBB.CCC: Network Function2");
}
}
}
namespace AAA.BBB
{
public class Adapter
{
public string Function1()
{
return "AAA.BBB: Adapter Function1 Called";
}
public void Function2()
{
Console.WriteLine("AAA.BBB: Adapter Function2");
}
}
public class Network
{
public string Function1()
{
return "AAA.BBB: Network Function1 called";
}
public void Function2()
{
Console.WriteLine("AAA.BBB: Network Function2");
}
}
}
Class2.cs
-----------
namespace AAA.CCC
{
public class Adapter
{
public string Function1()
{
return "AAA.CCC: Adapter Function1 Called";
}
public void Function2()
{
Console.WriteLine("AAA.CCC: Adapter Function2");
}
}
}
Then, I got below. It seems working great.
C:\Automation\PythonNet>nPython.exe
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append("c:\\automation\\pythonnet")
>>> import clr
>>> clr.FindAssembly("Adapter")
u'Adapter.dll'
>>> clr.AddReference("Adapter")
<System.Reflection.RuntimeAssembly object at 0x052E5828>
>>> adapter1 = Adapter()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Adapter' is not defined
>>> from AAA.BBB.CCC import Adapter
>>> from AAA.BBB.CCC import *
>>> adapter1 = Adapter()
>>> adapter1.Function1()
u'AAA.BBB.CCC: Adapter Function1 Called'
>>> adapter1.Function2()
AAA.BBB.CCC: Adapter Function2
>>> network1 = Network()
>>> network1.Function1()
u'AAA.BBB.CCC: Network Function1 called'
>>> from AAA.CCC import *
>>> adapter1.Function1()
u'AAA.BBB.CCC: Adapter Function1 Called'
>>> adapter1 = Adapter()
>>> adapter1.Function1()
u'AAA.CCC: Adapter Function1 Called'
>>>
My questions are
1. I don't know how to specify different namespace of class when creating
an instance.
2. The class that I already have has similar above layout in a project.
Common project has many class files in it, and each class has different
name space and class name.
AddReference('Common') looks working and loaded, but can't import.
>>> clr.AddReference('Common')
<System.Reflection.RuntimeAssembly object at 0x052E73C8>
>>> from Network import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named Network
>>> from Network.Common import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named Network.Common
>>>
Difference is that Common project has [Serializable] and enabled "Make
assembly COM-Visible"
[Serializable]
[Description("SimpleDictionary")]
public class SimpleDictionary : ISimpleDictionary
{
...
}
Any thoughts?
Wonder if there is a way to list available class after AddReference().
Thanks,
Spark.
On Thu, Apr 18, 2013 at 9:14 PM, Stephen P. Lepisto <stephenp at otakuworld.com
> wrote:
> Try this from python with pythonNet installed (the current directory is
> assumed to contain Adapter.dll):
>
> import clr
> clr.AddReference("Adapter") # Load the Adapter.dll
> from AAA.BBB import Adapter # Get the Adapter class type
> adapter = Adapter() # Create instance of the Adapter class
> adapter.GetSpeed() # Call the method
>
>
>
> On 4/18/2013 3:42 PM, Seungweon Park wrote:
>
> Thank you for the reply.
>
> I did
>
> >>> import clr
> >>> from System.Reflection import Assembly
> >>> Assembly.LoadWithPartialName("Adapter")
> <System.Reflection.RuntimeAssembly object at 0x05381148>
> >>> from AAA.BBB import Adapter
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> ImportError: No module named AAA.BBB
>
> I don't know why I got this. :-(
> Any idea?
>
>
>
> On Thu, Apr 18, 2013 at 3:07 PM, msutton <msutton at ucsd.edu> wrote:
>
>> What I use is:
>>
>> import clr
>> from System.Reflection import Assembly
>> Assembly.LoadWithPartialName('Demo')
>> from Render import Demo
>>
>> where the C# code has namespace Render and public class Demo.
>>
>> -Manuel
>>
>>
>> On 04/18/2013 02:45 PM, Seungweon Park wrote:
>>
>> Hi,
>>
>> I have Adapter.dll with namespace 'AAA.BBB.Adapter" written in C# which
>> gives network adapter information.
>> I want to call one of method GetSpeed(). I don't know How to create an
>> instance in python.
>> Would you give me some clue for writing the same python code like below
>> powershell script using python.net
>> I don't see any sample code which python creates C# class instance.
>>
>>
>> Python
>> ---------------------------
>> C:\CVS\Pythonnet>npython
>> Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
>> on win32
>> Type "help", "copyright", "credits" or "license" for more information.
>> >>> import os,sys
>> >>>
>> sys.path.append("c:\\cvs\\powershelliteexample\\networktestlibrary\\iteextensions")
>> >>> sys.path
>> ['', 'C:\\Python27\\lib\\site-packages\\paramiko-1.10.0-py2.7.egg',
>> 'C:\\CVS\\Python\\libs', 'C:\\Windows\\system32\\pyt
>> hon27.zip', 'C:\\Python27\\Lib', 'C:\\Python27\\DLLs',
>> 'C:\\Python27\\Lib\\lib-tk', 'C:\\CVS\\Pythonnet', 'C:\\Python27'
>> , 'C:\\Python27\\lib\\site-packages',
>> 'C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\',
>> 'c:\\cvs\\powershelliteexam
>> ple\\networktestlibrary\\iteextensions']
>> >>> import clr
>> >>> clr.FindAssembly("Adapter")
>>
>> u'c:\\cvs\\powershelliteexample\\networktestlibrary\\iteextensions\\Adapter.dll'
>> >>> clr.AddReference("Adapter")
>> <System.Reflection.RuntimeAssembly object at 0x052028A0>
>>
>> I don't know how to create an instance of Adapter.
>>
>>
>> Thank you,
>> Spark.
>>
>>
>> Powershell
>> ----------------------------
>> PS C:\CVS\PowershellITEExample> Import-Module .\LoadAdapter.psd1
>> PS C:\CVS\PowershellITEExample> $adapter = New-object -type
>> "AAA.BBB.Adapter"
>> PS C:\CVS\PowershellITEExample> $ret = $adapter.GetAdapter("TestAdapter",
>> "oids.xml")
>> PS C:\CVS\PowershellITEExample> $ret.Passed
>> True
>> PS C:\CVS\PowershellITEExample> $baseAdapter = $ret.FunctionReturnValue
>> PS C:\CVS\PowershellITEExample> $baseAdapter.GetSpeed()
>>
>> Passed : True
>> Failed : False
>> Errored : False
>> Status : Pass
>> Description : Speed retrieved successfully.
>> FunctionReturnValue : auto
>>
>>
>> _________________________________________________
>> Python.NET mailing list - PythonDotNet at python.orghttp://mail.python.org/mailman/listinfo/pythondotnet
>>
>>
>>
>
>
> _________________________________________________
> Python.NET mailing list - PythonDotNet at python.orghttp://mail.python.org/mailman/listinfo/pythondotnet
>
>
> --
> Stephen P. Lepisto
>
>
> _________________________________________________
> Python.NET mailing list - PythonDotNet at python.org
> http://mail.python.org/mailman/listinfo/pythondotnet
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythondotnet/attachments/20130419/cfafb620/attachment-0001.html>
More information about the PythonDotNet
mailing list