ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Перед публикацией этого вопроса я прочитал следующие и их ответы:
- 2791996 -COM-объекты C # с ошибкой VB6 / asp
- 4793844 - Передача строго типизированных аргументов в .NET COM Interop
Iнаписал оболочку класса .NET Mail
и еще один класс для SmtpClient
, чтобы сделать их пригодными для использования в ASP Classic и VB6.
Ниже SMTPSender
COM-видимого класса, который переносит SmtpClient
и егоинтерфейс (Dual для сохранения раннего связывания):
<Guid("f588b9e7-7107-4f3a-83a9-5e0e8f5297fd")>
<ClassInterface(ClassInterfaceType.None)>
Public Class SMTPSender
Implements ISMTPSender
'
Public Sub sendMail(ByVal mail As MailUtils.Mail) _
Implements ISMTPSender.sendMail
' [...]
End Sub
<Guid("cfe5e99b-c66a-4afb-8770-c0330994a823")>
<InterfaceType(ComInterfaceType.InterfaceIsDual)> _
Public Interface ISMTPSender
'[...]
Sub sendMail(ByVal mail As MailUtils.Mail)
'[...]
End Interface
Ниже объекта COM, видимого для Mail, который обертывает MailMessage
и его интерфейс (Dual тоже):
<Guid("d9252161-0731-4e6c-9964-66e4f56b97fa")>
<ClassInterface(ClassInterfaceType.None)>
Public Class Mail
Implements IMail
' [...]
End Class
<Guid("05a149ff-36e4-4905-9193-2fb8d31f5bd8")>
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
Public Interface IMail
' [...]
End Interface
Я не могу использоватьISmtpSender.sendMail в VBScript, а также в VB6, если я использую нетипизированные переменные.Ниже блока, в котором возникает проблема:
Dim smtpsender: Set smtpsender = CreateObject("Mailing.SMTPSender")
' [...] SMTP configuration...
Dim mail As mail: Set mail = CreateObject("Mailing.Mail") ' Typed variable
Dim mail2: Set mail2 = New MailUtils.mail ' Variant
' [...] mail and mail2 filling...
smtpsender.sendMail mail ' Success
smtpsender.sendMail mail2 ' Fails "Invalid procedure call or argument"
Я явно назначил GUID для каждого класса и интерфейса и предотвратил автогенерацию интерфейса для каждого класса (ClassInterfaceType.None
).Я все еще получаю это сообщение об ошибке.
Однако, окружение аргумента круглыми скобками (на основе ответа вопроса 4793844 ) удаляет ошибку:
smtpsender.sendMail (mail2)
Я не понимаю, почему, поскольку mail2
передается по значению (значение является ссылкой на содержимое объекта, как и в других языках IIRC).
Последнее решение не 't более чистым способом.
Я не могу использовать типизированную переменную, поскольку эти COM-видимые объекты будут использоваться на страницах ASP Classic VBScript , которые работают только с нетипизированными переменными .Что я пропустил, чтобы заставить SMTPSender
работать?