如何从 c++ 代码中使用 c# dll 中定义的类
How to use a class defined in c# dll from c++ code
我有一个用c#编写的 dll,我在c++代码中使用了这个 dll(正是 MFC)。我可以将 dll 函数与返回值 int、字符串...但是我需要使用带有返回值c#类的函数!我不知道MFC
哪种数据类型才能在c#dll 中输入函数的返回值。C#返回值对象在MFC
中转换为_variant_t
。请帮助我。感谢您阅读我的问题
C# 代码(摘要)
[Guid(" - - - - ")]
public interface ITestClass
{
object Func();
}
[Guid(" - - - - ")]
public class TestClass : ITestClass
{
public object Func()
{
Project1.Class1 data = dataList[0];
return data ;
}
}
MFC 代码(摘要)
ITestClass *ptc = NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_TestClass, NULL, CLSCTX_INPROC_SERVER, IID_ITestClass, reinterpret_cast<void**>(&ptc));
int sum = ptc->Sum(5, 30); // It is perfect
data = ptc->Func(); // I don't know what data type is
您必须在C++中定义相同的类。这有点难,可能是有缺陷的。所以我会尝试使用 CLI。
或者有一种更简单的方法。不要那样做:) 执行,使用旧的,好的机制,如:
int objectHandle = ptc->CreateObject();
int data = ptc->GetSomeIntData(objectHandle);
ptc->DoSomeOperation(objectHandle);
ptc->ReleaseObject(objectHandle);
这个想法是你C++没有一个类。该对象是在 C# 端创建的,并具有其唯一的对象句柄(可能是哈希代码)。在 CreateObject 中返回此句柄,在 C# 端可以将对象存储在字典中:
Dictionary<int, MyClass>
然后在C++端,你用你的objectHandle调用函数。
这是完成相同结果的更简单的方法。
但是如果你真的想使用这个类,你可以试试这个: - 确保 C# 库与 COM 兼容(注册 COM 互操作选项) - 编译 C# 库后,应该有一个 tlb 文件。在 C++ 中导入它:
#import "pathtolib.tlb"
接下来你可以像这样使用它:
CoInitialize(NULL);
ClassNamespace::ITestClassPtr myClass(__uuidof(ClassNamespace::TestClass));
myClass->Func();
CoUninitialize();
您还可以将所有功能包装C++类中。这当然会产生更多的工作,并且使您必须保留两个相似的代码(真正的类和包装器类)。但可能使用起来更友好。
如果你想返回其他类,你必须以类似的方式进行。创建 com 接口,在 c++ 中使用它,并在 c# 中返回它。
相关文章:
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- C++ dll 定义静态成员
- CPP DLL 自定义操作代码在安装过程中未执行
- 从模板继承的 MSVC DLL 导出类会导致LNK2005已定义的错误
- 使用自定义简单 Mapi DLL,无需安装 Outlook
- 是否可以单步执行.dll文件中定义的成员函数?
- 设置所需DLL文件的自定义路径:电子应用
- 我的自定义 C++ DLL 的 C# 项目中的 DLL 端口有什么问题?
- 如何在自定义操作DLL(MSI / Wix)中获取"INSTALLED"属性?
- 如何从 JAVA 程序中访问文件中定义的类.DLL方法
- 如何在库加载时将预处理器定义传递给 DLL
- 如何从 c++ 代码中使用 c# dll 中定义的类
- 构建不依赖于MSVCR120.DLL的自定义英特尔 MKL DLL
- MSI安装被自定义操作DLL中断
- 当InProcServer32键定义DLL的完整路径时,path环境变量中为什么需要COM DLL的路径
- 在QtCreator中链接dll的未定义引用错误
- Unity内部编译器错误与自定义DLL