6

C#からPythonオブジェクトを呼び出す簡単な方法はありますか?つまり、COMの混乱はありませんか?

4

3 に答える 3

8

はい、IronPython をホストすることによって。

于 2009-05-10T15:14:10.210 に答える
6

現在リリースされている C# のバージョンでは、何らかのブリッジ レイヤーを使用せずにこれを実現する優れた方法はありません。ある程度 IronPython をホストできますが、C# は非常に静的に型付けされた言語であるため、IronPython の動的機能を利用するのは困難です。

ただし、IronPython について話している場合、C# 4.0 はそれとシームレスに相互運用できるようになります。C# 4.0 では、DLR で実行されている任意の言語で動作できるようにする新しい機能 calldh dynamic が導入されています。

dynamic d = GetSomePythonObject();
d.SomeMethod();
于 2009-05-10T15:16:31.723 に答える
5

私は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 プロセスと通信させる必要があったときに、私のチームが行ったことです。

于 2009-05-10T15:18:32.250 に答える