如何用vs2013封装dll和lib文件可以用于vs2010

如何用vs2013封装dll和lib文件可以用于vs2010,第1张

public MappingMongoConverter mongoConverter() throws UnknownHostException {

MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), mongoMappingContext())

converter.setTypeMapper(mongoTypeMapper())

return converter

}

非托管的C++去调用C#代码比较麻烦。需要将C#部分的接口提取出来,导出到COM,然后C++通过COM来调用它。

如果没有COM相关基础知识的话,做起来会很累。

首先是这样的C#代码:

using System

using 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) 即可直接运行到断点处


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12438324.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存