باستخدام كائن COM المسجل DLL من .NET
سؤال
قمت بتنفيذ خادم Python Com وإنشاء ملف قابل للتنفيذ باستخدام أداة PY2EXE. ثم استخدمت Regsvr32.exe لتسجيل DLL.I حصلت على رسالة مفادها أن التسجيل كان ناجحا. ثم حاولت إضافة مرجع إلى تلك dll في .NET. لقد استعرضت في موقع DLL وحددها، لكنني تلقيت مربع رسالة خطأ يقول: تعذر إضافة مرجع إلى DLL، يرجى التأكد من أن الملف يمكن الوصول إليه وأنه مكونا صالحا للتجميع أو COM. يضاف رمز البرنامج النصي للخادم والإعداد أدناه. أريد أن أذكر أنه يمكنني تشغيل الخادم كبرنامج نصي ثعبان ويستهلكه من .NET باستخدام التوصيل المتأخر. هل هناك شيء أفتقده أو فعله خطأ؟ وسأكون ممتنا أي مساعدة.
شكرا، سارة
hello.py.
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
سأجيب على سؤالي لمساعدة أي شخص قد يكون له أسئلة مماثلة. آمل أن تساعد ذلك. لا أستطيع أن أجد الخادم الخاص بي على علامة التبويب COM لأنه، تحتاج .NET (و Visual-Studio) إلى خوادم COM مع TLB. لكن خوادم COM Python ليس لها TLB. لذلك لاستخدام الخادم من .NET عن طريق (C # والتغليف المتأخر). يوضح التعليمات البرمجية التالية كيفية جعل هذا:
// رمز 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.