从C#调用Excel / DLL / XLL函数

我有一个Excel插件(xll)中的特定function。 插件是专有的,我们无法访问源代码。 但是我们需要调用插件中包含的一些函数,我们想从C#程序中调用它。

目前,我正在考虑用xlopers编写一个调用Excel函数的C ++接口,然后从C#中调用这个C ++接口。

有这种问题的先前经验的人知道什么是最好的解决scheme吗?

安东尼

您需要创build一个假的x​​lcall32.dll ,把它放在与您的XLL相同的目录中(不要把Excel中自己的xlcall32.dll放在PATH中)。 这里是一些代码:

# include <windows.h> typedef void* LPXLOPER; extern "C" void __declspec(dllexport) XLCallVer ( ) {} extern "C" int __declspec(dllexport) Excel4 (int xlfn, LPXLOPER operRes, int count,... ) { return 0; } extern "C" int __declspec(dllexport) Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER far opers[]) {return 0;} 

现在假设我有一个名为xll-dll.xll的XLL,其中包含一个名为(使用“depends.exe”来查找导出函数的名称)xlAdd,它增加了两个双精度值:extern“C”__declspec(dllexport)XLOPER * __cdecl xlAdd(XLOPER * pA,XLOPER * pB);

下面的代码调用它:


 # include <windows.h> # include <iostream> // your own header that defines XLOPERs # include <parser/xll/xloper.hpp> // pointer to function taking 2 XLOPERS typedef XLOPER * (__cdecl *xl2args) (XLOPER* , XLOPER* ) ; void test(){ /// get the XLL address HINSTANCE h = LoadLibrary("xll-dll.xll"); if (h != NULL){ xl2args myfunc; /// get my xll-dll.xll function address myfunc = (xl2args) GetProcAddress(h, "xlAdd"); if (!myfunc) { // handle the error FreeLibrary(h); } else { /// build some XLOPERS, call the remote function XLOPER a,b, *c; a.xltype = 1; a.val.num = 1. ; b.xltype = 1; b.val.num = 2. ; c = (*myfunc)(&a,&b); std::cout << " call of xll " << c->val.num << std::endl; } FreeLibrary(h); } } int main() {test();} 

我的EXE实际上(我自己的意外),并输出3预期。 您必须对XLL实际所需的参数有一定的了解。 如果它分配了一些内存,则必须检查在XLOPER c->types上是否设置了#define xlbitDLLFree 0x4000,然后callback“xlAutoFree”。

您可能想试试XLL Plus http://www.planatechsolutions.com/xllplus/default.htm 。 这有点昂贵,但是XLL Wrapper Librariesfunction正是您所需要的:

“有时,能够从C ++,Java,C#或Visual Basic编写的其他环境(如命令行程序或交互式应用程序)中调用Excel加载项函数是有用的。Xll包装工具包包含工具,运行时库,示例和文档来帮助开发包装Excel XLL插件的COM模块和.NET程序集“

Excell加载项DLL可能用C#编写。 如果是这样,那么你可能完全绕过Excel。 可能需要封装。

检查程序集文件中是否有程序集文件可用,将程序集直接引用到C#项目中 – 检查对象浏览器中的类,方法或对象

你应该能够使用reflection来访问你的插件。 尝试使用reflection器看看有什么可用。