-1

VBAでC#のコールバック関数を使いたいです。しかし、C#関数を呼び出すと、「エントリポイントが見つかりません」と表示されます

どうすれば修正できますか?ありがとう

PS: Make assembly COM-Visible と COM inter Environment への登録をチェックしました: MS Office Excel 2007, MS Visual Studio 2008

VBA コード:

Declare Function Result Lib"C:\Users\admin\Desktop\myprog\New_DLL_Test\New_DLL_Test\bin\Debug\New_DLL_Test.dll" Alias "Msg" (ByVal p As Long) As Integer

Function Disp()
   MsgBox x
End Function

Sub AddResult(ByVal p As Long)
    Dim x As Long   
    x = Result(p)
    Debug.Print x
End Sub

Sub testnow_Click()
    Call AddResult(AddressOf Disp)
End Sub

C# コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace New_DLL_Test
{
    [Guid("f1286974-0f1a-466c-8389-dd1ab7e3eed2"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
    interface Msginterface
    {
        int Msg;
    }
    public unsafe class MsgProcess
    {
        public int Msg(int* p)
        {
           return add(p,1);
        }
        public int add(int* p, int j)
        {
            return j+1;
        }
    }

}
4

1 に答える 1

0

VBA 宣言関数を使用すると、DLL からエクスポートされた stdcall 関数にアクセスできます。COM 可視クラスとインターフェイスはまったく別のものです。2 つのメソッドは連携して動作しますが、アンマネージ エクスポートとして機能する関数は、com 可視オブジェクトを返すことができます。または、各方法を個別に使用することもできます。

VBA から静的 C# 関数を呼び出す

そのように VBA コードを記述し、そのように DLL にアクセスする場合は、C# プロジェクトからアンマネージ エクスポートを作成する必要があります。これには2つの方法があると思います。1 つは、マネージド C++ で関数をエクスポートするラッパーを手動で作成することです。もう 1 つは、コンパイル時のビルド タスクとUnmanagedExportsのようなライブラリを使用することです。

VBA からの COM 可視 C# オブジェクトの使用

COM 相互運用機能を介して C# クラスを使用するには、regasm.exe を使用して C# アセンブリを登録し、CreateObject 関数を使用して VBA でオブジェクトを作成する必要があります。クラスとインターフェイスの両方が COM から見える必要があります。ここで非常に基本的なチュートリアルを見つけることができます

于 2013-08-20T03:35:24.180 に答える