(извините за мой английский), теперь я впервые использую WCF, поэтому мой вопрос может быть очень простым) так: есть пример из MSDN: 1 решение - 2 проекта: сервис и клиент, как это: сервис:
<ServiceContract()> _
Public Interface ICalculator
<OperationContract()> _
Function Openserv(ByVal n1 As Integer) As Boolean
End Interface
Public Class Service
Implements ICalculator
Dim servicehost As System.ServiceModel.ServiceHost
Private Sub Service_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim baseAddress As Uri = New Uri("http://localhost:8000/ServiceModelSamples/service")
Dim address As String = "net.pipe://localhost/ServiceModelSamples/service"
servicehost = New System.ServiceModel.ServiceHost(GetType(Service), baseAddress)
Dim binding As System.ServiceModel.NetNamedPipeBinding = New System.ServiceModel.NetNamedPipeBinding(System.ServiceModel.NetNamedPipeSecurityMode.Transport)
binding.CloseTimeout = New TimeSpan(0, 1, 0)
binding.Name = "Binding1"
binding.OpenTimeout = New TimeSpan(0, 1, 0)
binding.ReceiveTimeout = New TimeSpan(0, 10, 0)
binding.SendTimeout = New TimeSpan(0, 10, 0)
binding.TransactionFlow = False
binding.TransactionProtocol = System.ServiceModel.TransactionProtocol.OleTransactions
binding.TransferMode = System.ServiceModel.TransferMode.Buffered
binding.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard
binding.MaxBufferPoolSize = 524288
binding.MaxBufferSize = 65536
binding.MaxConnections = 10
binding.MaxReceivedMessageSize = 65536
servicehost.AddServiceEndpoint(GetType(ICalculator), binding, address)
Dim smb As System.ServiceModel.Description.ServiceMetadataBehavior = New System.ServiceModel.Description.ServiceMetadataBehavior
smb.HttpGetEnabled = True
servicehost.Description.Behaviors.Add(smb)
servicehost.Open()
End Sub
Public Function Openserv(ByVal n1 As Integer) As Boolean _
Implements ICalculator.Openserv
If n1 > 0 Then
filename &= n1 & ":"
End If
Dim result As Boolean = True
Return result
End Function
End Class
client:
<System.ServiceModel.ServiceContract()> _
Public Interface ICalculatorClient
<System.ServiceModel.OperationContract()> _
Function Openserv(ByVal n1 As Integer) As Boolean
End Interface
Partial Public Class CalculatorClient
Inherits System.ServiceModel.ClientBase(Of ICalculatorClient)
Implements ICalculatorClient
Public Sub New()
MyBase.New()
End Sub
Public Sub New(ByVal endpointConfigurationName As String)
MyBase.New(endpointConfigurationName)
End Sub
Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(binding, remoteAddress)
End Sub
Public Function OpenServ(ByVal n1 As Integer) As Boolean Implements ICalculatorClient.Openserv
Return MyBase.Channel.Openserv(n1)
End Function
End Class
Public Class Client
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bld As New System.ServiceModel.NetNamedPipeBinding
Dim epa As New System.ServiceModel.EndpointAddress("net.pipe://localhost/servicemodelsamples/service")
Dim client As New CalculatorClient(bld, epa)
Dim value1 As Integer = 33
Dim result As Boolean = client.OpenServ(value1)
client.Close()
MessageBox.Show("Открыто в основном приложении")
End Sub
End Class
Теперь вопрос: как я могу сделать этот пример, когда клиент является сборкой codedom, генерируемой приложением-службой?что-то вроде этого: добавьте кнопку в основную форму приложения-службы и добавьте следующий текст:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
cr_text()
cr_app()
End Sub
Private Sub cr_text()
str_tb = "Imports System" & Chr(13) & Chr(10) & _
"Imports System.CodeDom" & Chr(13) & Chr(10) & _
"Imports System.CodeDom.Compiler" & Chr(13) & Chr(10) & _
"Imports System.Collections" & Chr(13) & Chr(10) & _
"Imports System.ComponentModel" & Chr(13) & Chr(10) & _
"Imports System.Diagnostics" & Chr(13) & Chr(10) & _
"Imports System.Windows.Forms" & Chr(13) & Chr(10) & _
"Imports System.Data" & Chr(13) & Chr(10) & _
"Imports System.Windows" & Chr(13) & Chr(10) & _
"Imports System.Data.SqlClient" & Chr(13) & Chr(10) & _
"Imports Microsoft.VisualBasic" & Chr(13) & Chr(10) & _
"Imports System.IO" & Chr(13) & Chr(10) & _
"Imports System.Drawing" & Chr(13) & Chr(10) & _
"Public Class MainClass" & Chr(13) & Chr(10) & _
"Public Shared Sub Main()" & Chr(13) & Chr(10) & _
"Dim tf As New test34" & Chr(13) & Chr(10) & _
"tf.show()" & Chr(13) & Chr(10) & _
"End Sub" & Chr(13) & Chr(10) & _
"End Class" & Chr(13) & Chr(10) & _
" <System.ServiceModel.ServiceContract()> _" & Chr(13) & Chr(10) & _
" Public Interface ICalculator" & Chr(13) & Chr(10) & _
" <System.ServiceModel.OperationContract()> _" & Chr(13) & Chr(10) & _
" Function Openserv(ByVal n1 As Integer) As Boolean" & Chr(13) & Chr(10) & _
" End Interface" & Chr(13) & Chr(10) & _
" Partial Public Class CalculatorClient" & Chr(13) & Chr(10) & _
" Inherits System.ServiceModel.ClientBase(Of ICalculator)" & Chr(13) & Chr(10) & _
" Implements ICalculator" & Chr(13) & Chr(10) & _
" Public Sub New()" & Chr(13) & Chr(10) & _
" MyBase.New()" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Public Sub New(ByVal endpointConfigurationName As String)" & Chr(13) & Chr(10) & _
" MyBase.New(endpointConfigurationName)" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)" & Chr(13) & Chr(10) & _
" MyBase.New(endpointConfigurationName, remoteAddress)" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress)" & Chr(13) & Chr(10) & _
" MyBase.New(endpointConfigurationName, remoteAddress)" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress)" & Chr(13) & Chr(10) & _
" MyBase.New(binding, remoteAddress)" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Public Function OpenServ(ByVal n1 As Integer) As Boolean Implements ICalculator.Openserv" & Chr(13) & Chr(10) & _
" Return MyBase.Channel.Openserv(n1)" & Chr(13) & Chr(10) & _
" End Function" & Chr(13) & Chr(10) & _
" End Class" & Chr(13) & Chr(10) & _
" <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _" & Chr(13) & Chr(10) & _
"Partial Class test34" & Chr(13) & Chr(10) & _
" Inherits System.Windows.Forms.Form" & Chr(13) & Chr(10) & _
" <System.Diagnostics.DebuggerNonUserCode()> _" & Chr(13) & Chr(10) & _
" Protected Overrides Sub Dispose(ByVal disposing As Boolean)" & Chr(13) & Chr(10) & _
" Try" & Chr(13) & Chr(10) & _
" If Disposing AndAlso components IsNot Nothing Then" & Chr(13) & Chr(10) & _
" components.Dispose()" & Chr(13) & Chr(10) & _
" End If" & Chr(13) & Chr(10) & _
" Finally" & Chr(13) & Chr(10) & _
" MyBase.Dispose(Disposing)" & Chr(13) & Chr(10) & _
" End Try" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Private components As System.ComponentModel.IContainer" & Chr(13) & Chr(10) & _
" <System.Diagnostics.DebuggerStepThrough()> _" & Chr(13) & Chr(10) & _
" Private Sub InitializeComponent()" & Chr(13) & Chr(10) & _
" Me.Button1 = New System.Windows.Forms.Button" & Chr(13) & Chr(10) & _
" Me.Button3 = New System.Windows.Forms.TextBox" & Chr(13) & Chr(10) & _
" Me.SuspendLayout()" & Chr(13) & Chr(10) & _
" Me.Button1.Location = New System.Drawing.Point(114, 40)" & Chr(13) & Chr(10) & _
" Me.Button1.Name = " & Chr(34) & "Button1" & Chr(34) & "" & Chr(13) & Chr(10) & _
" Me.Button1.Size = New System.Drawing.Size(231, 39)" & Chr(13) & Chr(10) & _
" Me.Button1.TabIndex = 0" & Chr(13) & Chr(10) & _
" Me.Button1.Text = " & Chr(34) & "Button1" & Chr(34) & "" & Chr(13) & Chr(10) & _
" Me.Button1.UseVisualStyleBackColor = True" & Chr(13) & Chr(10) & _
" Me.Button3.Location = New System.Drawing.Point(114, 90)" & Chr(13) & Chr(10) & _
" Me.Button3.Name = " & Chr(34) & "Button3" & Chr(34) & "" & Chr(13) & Chr(10) & _
" Me.Button3.Size = New System.Drawing.Size(231, 39)" & Chr(13) & Chr(10) & _
" Me.Button3.TabIndex = 2" & Chr(13) & Chr(10) & _
" Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)" & Chr(13) & Chr(10) & _
" Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font" & Chr(13) & Chr(10) & _
" Me.ClientSize = New System.Drawing.Size(465, 133)" & Chr(13) & Chr(10) & _
" Me.Controls.Add(Me.Button1)" & Chr(13) & Chr(10) & _
" Me.Controls.Add(Me.Button3)" & Chr(13) & Chr(10) & _
" Me.Name = " & Chr(34) & "test" & Chr(34) & "" & Chr(13) & Chr(10) & _
" Me.Text = " & Chr(34) & "test" & Chr(34) & "" & Chr(13) & Chr(10) & _
" Me.ResumeLayout(False)" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
" Friend WithEvents Button1 As System.Windows.Forms.Button" & Chr(13) & Chr(10) & _
" Friend WithEvents Button3 As System.Windows.Forms.TextBox" & Chr(13) & Chr(10) & _
"End Class" & Chr(13) & Chr(10) & _
"Public Class test34" & Chr(13) & Chr(10) & _
" Dim str_tb As String" & Chr(13) & Chr(10) & _
" Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click" & Chr(13) & Chr(10) & _
" Dim bld As New System.ServiceModel.NetNamedPipeBinding" & Chr(13) & Chr(10) & _
" Dim epa As New System.ServiceModel.EndpointAddress(" & Chr(34) & "net.pipe://localhost/servicemodelsamples/service" & Chr(34) & ")" & Chr(13) & Chr(10) & _
" Dim client As New CalculatorClient(bld, epa)" & Chr(13) & Chr(10) & _
" Dim value1 As Integer = Button3.Text" & Chr(13) & Chr(10) & _
" Dim result As Boolean = client.OpenServ(value1)" & Chr(13) & Chr(10) & _
" client.Close()" & Chr(13) & Chr(10) & _
" MessageBox.Show(" & Chr(34) & "Открыто в основном приложении" & Chr(34) & ")" & Chr(13) & Chr(10) & _
" End Sub" & Chr(13) & Chr(10) & _
"End Class"
End Sub
Private Shared Sub cr_app()
Dim objCodeCompiler As System.CodeDom.Compiler.CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("VB")
Dim objCompilerParameters As New System.CodeDom.Compiler.CompilerParameters()
objCompilerParameters.ReferencedAssemblies.Add("mscorlib.dll")
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll")
objCompilerParameters.ReferencedAssemblies.Add("System.dll")
objCompilerParameters.ReferencedAssemblies.Add("C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll")
objCompilerParameters.ReferencedAssemblies.Add("System.Xml.dll")
objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll")
objCompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll")
objCompilerParameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
objCompilerParameters.CompilerOptions = "/target:winexe"
objCompilerParameters.GenerateExecutable = True
objCompilerParameters.GenerateInMemory = True
objCompilerParameters.IncludeDebugInformation = False
Dim objCompileResults As System.CodeDom.Compiler.CompilerResults = objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, str_tb)
If objCompileResults.Errors.HasErrors Then
MessageBox.Show(String.Format("Error: Line>{0}, {1} # {2}", objCompileResults.Errors(0).Line, objCompileResults.Errors(0).ErrorText, objCompileResults.Errors(0).ErrorNumber))
Return
End If
Dim objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly
Dim objTheClass As Object = objAssembly.CreateInstance("MainClass")
If objTheClass Is Nothing Then
MsgBox("Can't load class...")
Exit Sub
End If
Try
objTheClass.GetType.InvokeMember("Main", System.Reflection.BindingFlags.InvokeMethod, _
Nothing, objTheClass, Nothing)
Catch ex As Exception
MsgBox("Error:" & ex.Message)
End Try
End Sub
, но клиент делает исключение "время ожидания истекло" ... как я могу заставить его работать?может использовать что-то еще вместо netpipebinding?Я могу переписать это на C #, если это поможет.Главный вопрос: как вызвать из сгенерированной сборки другую подпрограмму генерирующего ее класса?