
MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), mongoMappingContext())
converter.setTypeMapper(mongoTypeMapper())
return converter
}
非托管的C++去调用C#代码比较麻烦。需要将C#部分的接口提取出来,导出到COM,然后C++通过COM来调用它。
如果没有COM相关基础知识的话,做起来会很累。
首先是这样的C#代码:
using Systemusing System.Runtime.InteropServices
namespace ClassLibrary1
{
[ComVisible(true)]
[Guid("F3528A0F-D34F-4A5B-9849-0DCAD6212D5A")]
public interface MyInterface
{
int MyMethod(int param)
}
[Guid("32B922E0-FED2-40CC-A9D6-57FE3EE341E3")]
public class Class1 : MyInterface
{
public int MyMethod(int param)
{
Console.WriteLine("Class1.MyMethod is called!")
return param + 1
}
}
}
定义一个接口(待会儿C++调用对象上的方法要用),然后定义了一个类(待会儿C++创建对象要用),两个GUID一个标识接口的(在C++里QueryInterface的时候用)一个标识类的(在C++里CreateInstance的时候用)。GUID可以用VisualStudio自带的工具埋衫生成,也可以自己找在线生成的网站。
ComVisible就是决定是否这个接口在COM可见,要可见待会儿C++才能进行下一步。
然后是工程,工程类型是“类库”,然后工程属性找到“生成州改”那里,下面的“输出”有一个“为COM互 *** 作注册”,要勾起来。这样生成DLL的时候才会在注册表里面写入相关信息(需要你VisualStudio用管理员身份运行)。
然后这样生成的时候除了dll,还有一个tlb文件。这个tlb在C++里import,C++代码如下:
#ifdef _DEBUG#import "..\ClassLibrary1\bin\Debug\ClassLibrary1.tlb"
#else
#import "..\ClassLibrary1\bin\Release\ClassLibrary1.tlb"
#endif
#include <objbase.h>
#include <stdio.h>
int main()
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)
ClassLibrary1::MyInterface* myInterface
IID iid
CLSID clsid
IIDFromString(L"{F3528A0F-D34F-4A5B-9849-0DCAD6212D5A}", &iid)
CLSIDFromString(L"{32B922E0-FED2-40CC-A9D6-57FE3EE341E3", &clsid)
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, (LPVOID*) &myInterface)
if (hr == S_OK)
{
int x = myInterface->MyMethod(20)
printf("%d\n", x)
myInterface->Release()
}
else
printf("%s", "Fail to create object.\n")
CoUninitialize()
return 0
}
我也没办法,调用com就是比较麻烦……
生成的DLL和EXE如果要拿到其他电脑上运行,那么要先在注册表里注册一下这个DLL才行。
.net Framework里弯迹腔面有工具,在C:\Windows\Microsoft.NET\Framework\v4.0.30319文件夹能找到一个regasm工具,就是用来注册的。比如这样:
regasm /codebase ClassLibrary1.dll
如果要注销在注册表里添加的信息,可以这样:
regasm /unregister ClassLibrary1.dll
这个regasm工具在这里的作用就相当于regsvr32,只不过它是给.net程序集用的
附件是VS2013写的工程的例子,要以管理员身份运行VisualStudio才能编译链接通过然后执行(主要是注册DLL程序集的时候要管理员权限
文件菜单的 新建 里头点进去会出现 新建项目 的框
左边选择 Visual C++ 项目
右边选择 win32 控制台应用程序
并在下面起好名字,选好你的项目的文件夹位置
确定 之后会出一向导
先直接 下一步(不要点完成)
然后 在这一步选择 空项目 就可以了
点完成 就建好了项目
然后 在右边的 解决方案资源管理器 中 添加头文件或友行源文件吧
如果你是要写C的程序,建立C文件而不是CPP文件的话,仍然选择“C++源文件",但下面起名的时候,把扩展名由cpp改成c就是了(比方说把 源.cpp 改成 源.c)
然后,就可以写源代码了
程序代码写完后,点菜单栏 生成 菜单下的 生成解决方案 可完成编译并生成可执行文件
调试 菜单下的 开始执行(不调试) (或按Ctrl+F5)可以执行程序 (相当于VC++6.0 里面那个红色叹号),注意,你如果在这个时候,没有先执行“生成解决方案”这步的话,会先自动生成解决方案(也就是编译并生成可执行文亩告游件),生成成迅销功才会执行。
单步执行(调试)请使用 调试 菜单的 逐语句 或 逐过程
如果程序中设了断点的话,直接选择 调试 菜单下的 启动调试 (或者按F5) 即可直接运行到断点处
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)