C# 作为EXE而不是DLL的包装器(用C+;+;/CLI编写,围绕C类包装)

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,它必须提供一些函数(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包装文件编译为DLL文件:
    cl/clr/LD Test.cpp/link user32.lib
  • 运行DLL文件的导出函数:
    Test。dll@CppTestFunction
在C++/CLI文件的注释中,我描述了正在发生的事情

C#文件:

C++/CLI文件:

#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,这不太好。不要用它。