我在使用我的 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 文件,并尝试使用Wrapper.dll引用NET.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?非常感谢。