C#からPythonオブジェクトを呼び出す簡単な方法はありますか?つまり、COMの混乱はありませんか?
3 に答える
はい、IronPython をホストすることによって。
現在リリースされている C# のバージョンでは、何らかのブリッジ レイヤーを使用せずにこれを実現する優れた方法はありません。ある程度 IronPython をホストできますが、C# は非常に静的に型付けされた言語であるため、IronPython の動的機能を利用するのは困難です。
ただし、IronPython について話している場合、C# 4.0 はそれとシームレスに相互運用できるようになります。C# 4.0 では、DLR で実行されている任意の言語で動作できるようにする新しい機能 calldh dynamic が導入されています。
dynamic d = GetSomePythonObject();
d.SomeMethod();
私は3つの方法を知っています:
1) Iron Python を使用すると、Python プロジェクトは C# で記述されたプロジェクトと自由にやり取りできます。
2) Python 関数を COM に公開します。Iron Python に変換したくない、または変換できない Python ライブラリを使用する必要がある場合は、これを行います (たとえば、DLL しかない場合)。 Python コードと C# コードが同じマシンで実行されています。このチュートリアルのこのコードは、過度に醜いものではないことを示しています。
class PythonUtilities:
_public_methods_ = [ 'SplitString' ]
_reg_progid_ = "PythonDemos.Utilities"
# NEVER copy the following ID
# Use "print pythoncom.CreateGuid()" to make a new one.
_reg_clsid_ = "{41E24E95-D45A-11D2-852C-204C4F4F5020}"
def SplitString(self, val, item=None):
import string
if item != None: item = str(item)
return string.split(str(val), item)
# Add code so that when this script is run by
# Python.exe, it self-registers.
if __name__=='__main__':
print "Registering COM server..."
import win32com.server.register
win32com.server.register.UseCommandLine(PythonUtilities)
3) C# と Python がソケットを介して通信するようにします。これは、Iron Python に変換できないコードがあり、リモートでアクセスする必要がある場合に行います。これは、引数をマーシャリングおよびアンマーシャリングし、バイトまたは文字列から値を返す必要があるため、最も手間がかかりますが、C# をリモートの Python プロセスと通信させる必要があったときに、私のチームが行ったことです。