.NET から登録された com オブジェクト DLL を使用する
質問
Python com サーバーを実装し、py2exe ツールを使用して実行可能ファイルと DLL を生成しました。次に、regsvr32.exe を使用して dll を登録しました。登録が成功したというメッセージが表示されました。次に、.NET にその DLL への参照を追加しようとしました。DLL の場所を参照して選択しましたが、次のようなエラー メッセージ ボックスが表示されました。DLL への参照を追加できませんでした。ファイルがアクセス可能であること、およびファイルが有効なアセンブリまたは COM コンポーネントであることを確認してください。サーバーとセットアップ スクリプトのコードが以下に追加されます。サーバーを Python スクリプトとして実行し、遅延バインディングを使用して .net から使用できることに言及したいと思います。何か足りないことや間違っていることはありますか?助けていただければ幸いです。
感謝 サラ
こんにちは。
import pythoncom
import sys
class HelloWorld:
#pythoncom.frozen = 1
if hasattr(sys, 'importers'):
_reg_class_spec_ = "__main__.HelloWorld"
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_clsid_ = pythoncom.CreateGuid()
_reg_desc_ = "Python Test COM Server"
_reg_progid_ = "Python.TestServer"
_public_methods_ = ['Hello']
_public_attrs_ = ['softspace', 'noCalls']
_readonly_attrs_ = ['noCalls']
def __init__(self):
self.softspace = 1
self.noCalls = 0
def Hello(self, who):
self.noCalls = self.noCalls + 1
# insert "softspace" number of spaces
print "Hello" + " " * self.softspace + str(who)
return "Hello" + " " * self.softspace + str(who)
if __name__=='__main__':
import sys
if hasattr(sys, 'importers'):
# running as packed executable.
if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:
# --register and --unregister work as usual
import win32com.server.register
win32com.server.register.UseCommandLine(HelloWorld)
else:
# start the server.
from win32com.server import localserver
localserver.main()
else:
import win32com.server.register
win32com.server.register.UseCommandLine(HelloWorld)
setup.py
from distutils.core import setup
import py2exe
setup(com_server = ["hello"])
解決 2
私は同様の質問があるかもしれいずれかを助けるために私の質問にお答えします。私はそれが役立つだろう願っています。 .NET(&ビジュアル-Studioは)TLBとCOMサーバーを必要とする、ので、私はCOM]タブで自分のサーバーを見つけることができません。しかし、PythonのCOMサーバーにはTLBを持っていません。 だから、(C#と結合後期)で、.NETからサーバーを使用します。次のコードは、これを作成する方法を示します:
// C#のコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Type pythonServer;
object pythonObject;
pythonServer = Type.GetTypeFromProgID("PythonDemos.Utilities");
pythonObject = Activator.CreateInstance(pythonServer);
}
}
} `
他のヒント
行:
_reg_clsid_ = pythoncom.CreateGuid()
は毎回このファイルが呼び出された新しいGUIDが作成されます。あなたは、コマンドライン上でGUIDを作成することができます:
C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}
、その後、あなたの行を変更します:
_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"
この変更を行った後、私はあなたのコードを実行し、次のVBScriptでそれをテストすることができました。
Set obj = CreateObject("Python.TestServer")
MsgBox obj.Hello("foo")
私は、これは「参照の追加」の問題を修正するかどうかを確認するためにMSVCが手元にありません。
登録済みのものを利用したい場合は、 コム オブジェクトの場合は、[Com] タブで見つける必要があります。 参照の追加 ダイアログボックス。dll には移動しません。