후반

2012-05-04 2 views
1

바인딩과 VB.Net에서 C#을 DLL 내부에 위치하는 방법을, 전화를 어떻게 얼마나 다양한 "초기화", "누산"에 그립을 얻을 수 없습니다 ... 방법은 호출 가능하도록 작동 메서드는 VB.Net 코드에서 DLL 안에 있습니다.후반

public double ComputeMeanPosition(ref SortedList<DateTime, double> posByTime) 

당신이 제발 친절하게 방법의 사용의 실제 예를 날 지점, 또는 단순히 어떻게 실제로 나에게로 몇 가지 힌트를 줄 것이다 :

의이 방법은 전화를 가정 해 봅시다하면 다음과 같은 서명이 메서드에 매개 변수를 전달하고, 호출하고 결과를 가져 오겠습니까?

@Olivier Jacot-Descombes : 나는 확실히 네임 스페이스 이름으로 클래스 이름 앞에 있지만 아직 객체에 도달 할 수 실패합니다. 사실 나는,로드 된 DLL의 성찰을 통해 표시되는 네 종류의 제안은 다음과 같은 방법을 포함하지 않는 것을 놀랜다 : 나는 다음과 비슷한 코드를 사실

Type: MyClassName 
     Method: Void Init() 
     Method: Void Accumulate(System.Data.SqlTypes.SqlDouble, System.Data.SqlTypes.SqlDateTime, System.Data.SqlTypes.SqlBoolean) 
     Method: Void Merge(MyClassName) 
     Method: System.Data.SqlTypes.SqlDouble Terminate() 
     Method: Void Write(System.IO.BinaryWriter) 
     Method: Void Read(System.IO.BinaryReader) 
     Method: Boolean Equals(System.Object) 
     Method: Int32 GetHashCode() 
     Method: System.String ToString() 
     Method: System.Type GetType() 

편집, DLL을 검사하고 그 중 몇 가지 유형과 메소드를 성공적으로 관리하여 위에서 호출 한 메소드에 대해 위의 결과를 얻습니다. 여기

이 보인다 코드

끝에
 For Each oneModule As Reflection.Module In useAssembly.GetLoadedModules() 
      Console.WriteLine(" - " & oneModule.Name) 
      For Each oneType As System.Type In oneModule.GetTypes() 
       Console.WriteLine("  Type: " & oneType.Name) 
       For Each oneField As Reflection.FieldInfo In oneType.GetFields() 
        Console.WriteLine("  Field: " & oneField.ToString()) 
       Next oneField 

       For Each oneMethod As Reflection.MethodInfo In oneType.GetMethods() 
        Console.WriteLine("  Method: " & oneMethod.ToString()) 

        [[ ADD "Invoke" here ?]] 
       Next oneMethod 
      Next oneType 
     Next oneModule 

있다는 [...] 상기 호출 방법의 메소드를 호출하는 호출되어야하는 장소에있을 내 선택,하지만 그게 내가 붙어있어 ... 내가 그것을 호출하기 전에 개체를 작성해야합니까? 매개 변수를 어떻게 전달해야합니까? 결과를 얻는 방법? VB에서 다음과 같이

Public Function ComputeMeanPosition(_ 
    ByRef posByTime As SortedList(Of DateTime, Double)) As Double 

참고 선언 된 것처럼

+2

어떻게 당신이에 메서드를 호출 할 객체를 만드는? –

+0

메소드가 정적 인 경우를 가정 해 보겠습니다. 그냥 물건을 계산합니다. 그래서 VB.Net 코드에서, 나는 그것을 전달해야 할 객체들을 가지고있다. DLL을로드하고 난 다음 메서드를 호출하고 싶습니다 ... –

답변

1

이 메서드를 호출 할 수 있습니다 : 나는 VB로 C# 코드를 변환하려면이 온라인 snippet converter을 사용했다. 변환하기 전에 C# 메서드 머리글에 빈 메서드 본문 {}을 추가해야합니다.

public double ComputeMeanPosition(ref SortedList<DateTime, double> posByTime) {} 
이 방법은 (VB에서 Shared) C#에서 static로 선언되지 않기 때문에

하면 객체를 생성하는 첫번째 필요. 이 메서드는 클래스 내에서 선언 될 가능성이 큽니다. 객체

를 만들 때 당신이 그들을 통과해야합니다, 당신은 생성자합니다 ( New 방법) 인수를 선언하면이

Dim posByTime = New SortedList(Of DateTime, Double)() 
Dim obj = New MyClass() 
Dim result As Double = obj.ComputeMeanPosition(posByTime) 

같은 것을 작성해야,의 클래스가 "MyClass에"지명되었다 가정 해 봅시다

Dim obj = New MyClass(arg1, arg2, ...) 

ComputeMeanPosition가 기대하는 내용에 따라, 당신은 그것을 호출하기 전에 목록 posByTime에 항목을 추가해야합니다.방법은 C#을 (VB에서 Shared)에서 static로 선언 된 경우


, 당신은 대신 객체를 생성하는 클래스의 이름으로 자격을 것입니다. 당신이 어셈블리를로드 할 경우

Dim posByTime = New SortedList(Of DateTime, Double)() 
Dim result As Double = MyClass.ComputeMeanPosition(posByTime) 

UPDATE

동적으로 당신은 아마이

Dim ass As Assembly = Assembly.LoadFrom("C:\SomePath\MyDll.dll") 
Dim obj As Object = ass.CreateInstance("MyClass", True) 

Dim posByTime = New SortedList(Of DateTime, Double)() 
Dim result As Double = obj.ComputeMeanPosition(posByTime) 

같은 것을 할 것입니다 그리고 당신은 후기 바인딩에 대한 Option Strict Off을 설정해야합니다. 생성자 인수가 필요한 경우 나 실제의 앞에 앉아 아니라서


, 당신은이 실제 코드가 아닙니다 CreateInstance

Dim args = new Object() { arg1, arg2, ... } 
Dim obj As Object = ass.CreateInstance("MyClass", True, _ 
    BindingFlags.Public Or BindingFlags.Instance, Nothing, Nothing, _ 
    args, Nothing, Nothing) 
+0

나는 분명히 자신을 표현한 확실하지 않습니다 : 사실 VB.Net 코드의 시작 전에 DLL에 액세스 할 수 없습니다. 사실 동적으로 프로그램을 실행하는 동안 DLL을로드 ... 귀하의 제안을 비록 작동하지 않을 수 있습니다. –

+1

동적 어셈블리 로딩의 경우 업데이트를 추가했습니다. –

+0

많은 감사합니다 !! 그것을 시도하려고합니다. –

2

의 또 다른 오버로드에 전달해야합니다 이 같은이

// using System.Reflection required 

// first load the external assembly into the appdomain and 
// create an instance of the object 
var assembly = Assembly.Load("Path to the Assembly"); 
var type = assembley.GetType("TheNameOfTheClass"); 
var ctor = type.GetConstuctor(); 
var object = ctor.Invoke(); // assuming an empty construtor, else you'll need to pass in data 

// next invoke the method 
var methodInfo = assembly.GetMethodByName("ComputeMeanPosition"); 
var param = new SortedList<DateTime, double>(); 
var result = methodInfo.Invoke(object, new object[] { param }); 
5

뭔가 같은 C#을 편집기,하지만 뭔가 일을해야합니다

,649,VB.NET에 대한

는 :

Imports System 
Imports System.Reflection 
Imports System.IO 

Public Class MainClass 
    Public Shared Function Main(args As String()) As Integer 
     Dim a As Assembly = Nothing 
     Try 
      a = Assembly.Load("YourLibraryName") 
     Catch e As FileNotFoundException 
      Console.WriteLine(e.Message) 
     End Try 

     Dim classType As Type = a.[GetType]("YourLibraryName.ClassName") 

     Dim obj As Object = Activator.CreateInstance(classType) 

     Dim [paramArray] As Object() = New Object(0) {} 
     [paramArray](0) = New SortledList(Of DateTime, Double)() 
     Dim mi As MethodInfo = classType.GetMethod("ComputeMeanPosition") 
     mi.Invoke(obj, [paramArray]) 

     Return 0 
    End Function 
End Class 

테스트하고이 일 :

Dim a As Assembly = Nothing 
    Try 
     a = Assembly.Load("TestLib") 
    Catch ex As FileNotFoundException 
     Console.WriteLine(ex.Message) 
    End Try 

    Dim classType As Type = a.[GetType]("TestLib.Class1") 

    Dim obj As Object = Activator.CreateInstance(classType) 

    Dim [paramArray] As Object() = New Object(0) {} 
    [paramArray](0) = New SortedList(Of DateTime, Double)() 
    Dim mi As MethodInfo = classType.GetMethod("ComputeMeanPosition") 
    mi.Invoke(obj, [paramArray]) 
+0

고마워요! 해봐. –

+0

오 ... 조금 자세히 :). VB.Net에서 메서드를 호출하려고하는데 C#이 아닙니다. –

+1

@SkippyFastol - 방금 VB.NET 솔루션 – Icemanind

관련 문제