C# 作为EXE而不是DLL的包装器(用C+;+;/CLI编写,围绕C类包装)
我想用C#编写一个DLL,它必须提供一些函数(API)。MSIL代码修饰符承诺提供C#方法作为DLL导出,这让我很失望。因此,我现在尝试使用C++/CLI编写一个桥DLL,它应该只调用静态C#方法。C++/CLI对我来说是新的和神秘的 以下是我在命令行中使用的命令:C# 作为EXE而不是DLL的包装器(用C+;+;/CLI编写,围绕C类包装),c#,.net,visual-c++,c++-cli,dllexport,C#,.net,Visual C++,C++ Cli,Dllexport,我想用C#编写一个DLL,它必须提供一些函数(API)。MSIL代码修饰符承诺提供C#方法作为DLL导出,这让我很失望。因此,我现在尝试使用C++/CLI编写一个桥DLL,它应该只调用静态C#方法。C++/CLI对我来说是新的和神秘的 以下是我在命令行中使用的命令: 将C#文件编译为DLL文件:csc/target:library CSharpClass.cs 将C++/CLI包装文件编译为可执行文件:cl/clr Test.cpp/link user32.lib 将C++/CLI包装文件编译
- 将C#文件编译为DLL文件:
csc/target:library CSharpClass.cs
- 将C++/CLI包装文件编译为可执行文件:
cl/clr Test.cpp/link user32.lib
- 将C++/CLI包装文件编译为DLL文件:
cl/clr/LD Test.cpp/link user32.lib
- 运行DLL文件的导出函数:
Test。dll@CppTestFunction
#using <mscorlib.dll>
// It doesn't matter, whether this path is absolute or not:
#using "CSharpClass.dll"
#include <windows.h>
using namespace CSharpNamespace;
extern "C" __declspec(dllexport) void CppTestFunction() {
CSharpClass::TestMethod(); // Works with EXE; DLL crashes
// System::Console::Beep(); // Works with EXE and DLL
// MessageBoxW(NULL, (LPCWSTR)"", (LPCWSTR)"", 0); // Works with EXE and DLL
}
void main() {
CppTestFunction();
}
#使用
//不管这条路径是绝对的还是非绝对的:
#使用“CSharpClass.dll”
#包括
使用名称空间和名称空间;
外部“C”uu declspec(dllexport)void CppTestFunction(){
CSharpClass::TestMethod();//使用EXE;DLL崩溃
//System::Console::Beep();//可用于EXE和DLL
//MessageBoxW(NULL,(LPCWSTR)“,(LPCWSTR)”,0);//用于EXE和DLL
}
void main(){
CppTestFunction();
}
汉斯·帕桑(Hans Passant)的评论是正确的,他知道为什么DLL版本不能成功调用C代码吗。谢谢你的提示 工作测试用例 命令行:
csc/target:library CSharpClass.cs
cl/clr/LD TestDll.cpp/link user32.lib
cl DllCallingTestExe.cpp/link TestDll.lib
TestDll.cpp
:
#using <mscorlib.dll>
#using "CSharpClass.dll"
#include "TestDll.h"
using namespace CSharpNamespace;
extern "C" __declspec(dllexport) void __stdcall CppTestMethod() {
CSharpClass::TestMethod();
}
#include "TestDll.h"
void main() {
CppTestMethod();
}
DllCallingTestExe.cpp
:
#using <mscorlib.dll>
#using "CSharpClass.dll"
#include "TestDll.h"
using namespace CSharpNamespace;
extern "C" __declspec(dllexport) void __stdcall CppTestMethod() {
CSharpClass::TestMethod();
}
#include "TestDll.h"
void main() {
CppTestMethod();
}
您使用的这个“winapiexec”实用程序有点粗糙,尤其是当它没有告诉我们出了什么问题时。它确实需要您公开的函数类似于winapi函数。你的没有。它不是uu stdcall,它没有像BOOL这样的返回类型,也没有设置错误代码(SetLastError)。而且您的C++/CLI程序集实际上不是DLL,这不太好。不要用它。