在C#中。我定义了一个委托类型public delegate void CallTest(int i);然后定义了一个变量:public CallTest mCallTest;
封装成DLL。
在C++中应用了这个库。请问怎么给mCallTest赋值?我在C++中定义了一个函数。怎么赋给MCallTest?
关于C++调用C#的DLL问题。
答案:2 悬赏:40 手机版
解决时间 2021-01-25 00:39
- 提问者网友:了了无期
- 2021-01-24 16:59
最佳答案
- 五星知识达人网友:胯下狙击手
- 2021-01-24 18:22
先将DLL转成Com类型,然后再C#中按照Com类型调用DLL。
示例如下:
C#代码:工程名ManagedDLL
using System;
namespace ManagedDLL
{
// Interface declaration.
public interface ICalculator
{
int Add(int Number1, int Number2);
};
// Interface implementation.
public class ManagedClass:ICalculator
{
public int Add(int Number1,int Number2)
{
return Number1+Number2;
}
}
}把AssemblyInfo.cs中的 assembly: ComVisible改成true
注册DLL:RegAsm.exe ManagedDLL.dll /tlb:ManagedDLL.tlb /codebase
在C++代码中:(工程属性里设置/clr:oldSyntax)
#include "stdafx.h"
#include "tchar.h"
#import "..\ManagedDLL\bin\Debug\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitialize(NULL); // Initialize COM.
ICalculatorPtr pICalc(__uuidof(ManagedClass));
long lResult = 0;
pICalc->Add(5, 10, &lResult); // Call the Add method.
wprintf(L"The result is %d\n", lResult);
CoUninitialize(); // Uninitialize COM.
return 0;
}
示例如下:
C#代码:工程名ManagedDLL
using System;
namespace ManagedDLL
{
// Interface declaration.
public interface ICalculator
{
int Add(int Number1, int Number2);
};
// Interface implementation.
public class ManagedClass:ICalculator
{
public int Add(int Number1,int Number2)
{
return Number1+Number2;
}
}
}把AssemblyInfo.cs中的 assembly: ComVisible改成true
注册DLL:RegAsm.exe ManagedDLL.dll /tlb:ManagedDLL.tlb /codebase
在C++代码中:(工程属性里设置/clr:oldSyntax)
#include "stdafx.h"
#include "tchar.h"
#import "..\ManagedDLL\bin\Debug\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitialize(NULL); // Initialize COM.
ICalculatorPtr pICalc(__uuidof(ManagedClass));
long lResult = 0;
pICalc->Add(5, 10, &lResult); // Call the Add method.
wprintf(L"The result is %d\n", lResult);
CoUninitialize(); // Uninitialize COM.
return 0;
}
全部回答
- 1楼网友:举杯邀酒敬孤独
- 2021-01-24 18:42
c#的结构定义 修改一下试试
public struct cthostftdcrequserloginfield
{
///交易日
[marshalas(unmanagedtype.lpstr)]
public string tradingday;
参考:
internal struct copydatastruct
{
public intptr dwdata;
private int _cbdata;
[marshalas(unmanagedtype.lpstr)]
private string _lpdata;
public int cbdata
{
get { return _cbdata; }
}
public string lpdata
{
get { return _lpdata; }
set
{
byte[] sarr = encoding.default.getbytes(value);
_cbdata = sarr.length + 1;
_lpdata = value;
}
}
}
[dllimport("user32.dll", entrypoint = "postmessage")]
internal static extern int postmessage(
int hwnd,
int msg,
int wparam,
int lparam
);
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯