如何在C应用程序中使用C# DLL?

3
我有一个C# DLL文件,我通过导入相应的.tlb文件在我的.cpp文件中使用COM Interop将该DLL用于C++中,并且这样做完全没有问题。现在我想要在C语言中使用同样的DLL,但由于我无法在C程序中使用#import,那么我应该如何使用已经注册为COM组件的DLL?

2
问题出在哪里?只需从IDL获取一个头文件即可。 - leppie
1
无论如何,您都可以像在C中使用任何COM对象一样使用它此处有一个非常简单的示例。 - Adriano Repetti
谷歌了几个答案,也许这个能有所帮助。https://dev59.com/8EfRa4cB1Zd3GeqP6iXD - CrazyBean
根据过去的经验,我建议你要么重新编写C函数,要么迁移到C#。多年前,我花了很多时间尝试让我的C代码调用托管代码。当时我成功了,但是几年后,在进行了大量更改之后,从C到托管dll的调用断裂了,我似乎无法记起以前做过什么来使其运行。根据我的记忆,您需要:1)使用COMVisible属性,2)使用强名称程序集,3)生成.tlb文件,4)将dll添加到GAC,5)使用regsvr注册.tlb。 - Tien Dinh
顺便提一下,我们最终重写了C#,这样其他开发人员可以进行维护。 - Tien Dinh
1个回答

0

这是一个包含3个文件的简单示例:

  1. C#中的DLL
  2. C++/CLR中的接口程序
  3. C++中的主程序

首先是C# DLL。它将被构建为一个DLL。

using System;
using System.Collections.Generic;
using System.Text;

namespace csdll
{
   public class ReturnValues
   {
      public void CSGetInt(ref int x)
      {
         x = 42;
      }

      public void CSGetStr(ref string s)
      {
         s = "Hey it works";
      }
   }
}

现在是接口程序。这是粘合逻辑。它必须编译为C++/CLR,但可以与主项目在同一个项目中:只是不能在同一个文件中编译,因为需要不同的编译方式。在“常规”下的公共语言运行时支持中,选择“公共语言运行时支持(/clr)”。
#include <string>
#include <msclr\marshal_cppstd.h>
#using "csdll.dll"
using namespace System;

extern void cppGetInt(int* value)
{
   csdll::ReturnValues^ rv = gcnew csdll::ReturnValues();
   rv->CSGetInt(*value);
}

extern void cppGetStr(std::string& value)
{
   System::String^ csvalue;
   csdll::ReturnValues^ rv = gcnew csdll::ReturnValues();
   rv->CSGetStr(csvalue);
   value = msclr::interop::marshal_as<std::string>(csvalue);
}

现在是主程序。

#include "stdafx.h"
#include <iostream>
#include <string>

// These can go in a header
extern void cppGetInt(int* value);
extern void cppGetStr(std::string& value);

int _tmain(int argc, _TCHAR* argv[])
{
   int value = 99;
   std::string svalue = "It does not work";
   cppGetInt(&value);
   std::cout << "Value is " << value << std::endl;
   cppGetStr(svalue);
   std::cout << "String value is " << svalue << std::endl;
   return 0;
}

将依赖项设置为DLL。 将构建平台设置为混合平台而不是win32或任何CPU。如果设置为其中任何一个,某些内容将无法构建。运行它,您将会得到

Value is 42
String value is Hey it works

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接