1

さまざまな「Init」、「Accumulate」... メソッドがどのように機能し、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

最後に、[[...]] は、選択したメソッドを呼び出すために Invoke メソッドを呼び出す必要がある場所にあるようですが、そこが行き詰まっている場所です...ビルドする必要がありますか?呼び出す前のオブジェクト? どのようにパラメータを渡す必要がありますか? 結果を取得する方法は?

4

3 に答える 3

7

このようなものが機能するはずです:

using System;
using System.Reflection;
using System.IO;

public class MainClass
{
      public static int Main(string[] args)
      {
           Assembly a = null;
           try
           {
                a = Assembly.Load("YourLibraryName");
           }
           catch(FileNotFoundException e)
               {Console.WriteLine(e.Message);}

           Type classType = a.GetType("YourLibraryName.ClassName");

           object obj = Activator.CreateInstance(classType);

           object[] paramArray = new object[1];    
           paramArray[0] = new SortledList<DateTime, double>();
           MethodInfo mi = classType.GetMethod("ComputeMeanPosition");
           mi.Invoke(obj, paramArray);

           return 0;
       }
 }

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])
于 2012-05-04T14:50:57.687 に答える
2

私は実際の C# エディターの前に座っているわけではないので、これは実際のコードではありませんが、次のようなものです。

// 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 });
于 2012-05-04T14:45:38.650 に答える
1

このメソッドは、VB でこのように宣言されているかのように呼び出すことができます。

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

注: このオンラインスニペット コンバーターを使用して、C# コードを VB に変換しました。変換する前に、空のメソッド本体{}を C# メソッド ヘッダーに追加する必要があります。

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

このメソッドはstaticC# ( SharedVB) のように宣言されていないため、最初にオブジェクトを作成する必要があります。メソッドは、クラス内で宣言されている可能性が最も高いです。クラスの名前が「MyClass」であるとしましょう。この場合、次のように記述する必要があります。

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

コンストラクター (Newメソッド) が引数を宣言する場合、オブジェクトの作成時にそれらを渡す必要があります。

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

ComputeMeanPosition期待される内容に応じて、posByTime呼び出す前にリストに項目を追加する必要があります。


staticメソッドがC# ( SharedVB)のように宣言されている場合は、オブジェクトを作成する代わりに、クラス名で修飾します。

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

アップデート

アセンブリを動的にロードすると、おそらく次のようになります

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)
于 2012-05-04T14:44:11.487 に答える