当我在VBA中使用C#回调函数时;未找到入口点”;

本文关键字:入口 函数 回调 VBA | 更新日期: 2023-09-27 18:28:13

我想在VBA中使用C#回调函数。但当我调用C#函数时,它显示"未找到入口点"

我该怎么修?感谢

PS:我检查了使程序集COM可见并注册COM内部环境: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;
        }
    }
}

当我在VBA中使用C#回调函数时;未找到入口点”;

VBA声明函数允许您访问从DLL导出的stdcall函数。COM可见的类和接口是完全不同的。尽管这两种方法可以一起工作,但作为非托管导出的函数可以返回com可见对象。或者每种方法都可以独立使用。

从VBA调用静态C#函数

如果要以这种方式编写VBA代码,并像这样访问DLL,则需要从C#项目创建非托管导出。我相信有两种方法可以做到这一点。一种是在托管C++中手动创建一个导出函数的包装器。另一种方法是使用像UnmanagedExports这样的编译时构建任务和库。

从VBA中使用COM可见的C#对象

若要通过COM互操作使用C#类,需要使用regasm.exe注册C#程序集,然后使用CreateObject函数在VBA中创建对象。类和接口都需要是COM可见的。你可以在这里找到一个非常基本的教程。