繁体   English   中英

从本机C ++调用.NET dll

[英]Calling .NET dll from native C++

我在使用COM包装器调用.NET dll( mclNET.dll )时遇到问题。 这是我没有源代码的第三部分dll。 基本上我想在我的纯本机C ++应用程序中使用这个mclNET.dll ,所以我正在开发一个C#包装器。 MCLWrapper.dll,这使得在mclNET.dll方法可见。 这是我做的:

  • MCLWrapper.dll中 ,我添加了mclNET.dll作为参考,然后定义接口以使mclNET.dll方法可见。 这是我的一些代码:

     using System; using System.Collections.Generic; using System.Linq; using System.Text; using mclNET; namespace MCLWrapper { public interface MCLControl { void MCLConnect(string SerialNumber); void MCLSet_Switch(string SwitchName, int Val); void MCLDisconnect(); }; public class MCLControlClass:MCLControl { private USB_RF_SwitchBox _sb = new USB_RF_SwitchBox(); public void MCLConnect(string SerialNumber) { _sb.Connect(ref SerialNumber); } public void MCLSet_Switch(string SwitchName, int Val) { _sb.Set_Switch(ref SwitchName, ref Val); } public void MCLDisconnect() { _sb.Disconnect(); } } } 

这是MCLWrapper.dll的AssemblyInfor.cs:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MCLWrapper")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MCLWrapper")]
[assembly: AssemblyCopyright("Copyright ©  2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//[assembly: AssemblyKeyFile("..\\MCLWrapper.SNK")]


// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("14fa8796-ee52-4e39-8481-f893ad92bb68")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
  • 然后在我构建这个Wrapper.dll后 ,我使用regasm命令注册它,以生成.tlb文件

  • 然后在我的本机C ++应用程序中,我导入了tlb文件,并尝试使用引用了.NET.dllWrapper.dll 以下是本机C ++应用程序中的一些代码:

     #include "stdafx.h" #include "math.h" #include "DetectorSwitch.h" #include "DetectorSwitchSetupXML.h" #include "OleAuto.h" #import "C:/MyPath/MCLWrapper.tlb" raw_interfaces_only wchar_t message[256]; using namespace MCLWrapper; long DetectorSwitch::FindDevices(long &deviceCount) { long ret = TRUE; deviceCount=0; HRESULT hCoInitialize = CoInitialize(NULL); MCLControlPtr MySwitch(__uuidof(MCLControlClass)); HRESULT hConnet = MySwitch->MCLConnect(_SN); // connect to sc short output = 1; MySwitch->MCLSet_Switch(&_A,&output); } 

现在问题是,它无法识别MySwitch->MCLSet_Switch(&_A,&output)函数,这意味着mclNET.dll尚未完全暴露给我的本机C ++代码。

我想知道这里有什么问题? 我怎么能通过任何机会纠正它? 我怎样才能在我的原生C ++应用程序中调用.NET dll? 非常感谢前方。

#import <mscorlib.tlb> raw_interfaces_only
#import C:/MyPath/MCLWrapper.tlb" no_namespace named_guids

尝试上面提到的import语句 - 适用于我并调用您的.net代码,而不使用本机C ++中的任何命名空间。

我终于解决了这个问题。 我想我基本上做了两件事:

  1. 下载最新的NET.dll ;

  2. 我创建了一个新项目“MCLWrapper”,它生成一个新的MCLWrapper.dll并清理粘贴旧项目中的代码。

也许我在旧项目中搞砸了一些我没有意识到的事情。 也许是新的NET.dll做了神奇的事。 我不知道。 我基本上重复了我的所作所为,但这一次非常干净。

不知怎的,我得到了它的工作。 所以基本上,我的原始线程几乎是如何从本机C ++代码调用.NET dll。 希望我的经验对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM