C++/CLI中有效使用非托管并列缓存

Visual Studio安装程序会把Visual Studio的共享库放在一个称为"并列缓存(side-by-side cache)"的地方,那怎样才能有效地利用它呢?

在文章开头,先看一个示例。在命令行中,创建一个C++源文件,输入例1中的代码。(虽然此处使用的是C++/CLI语法,但不管你是用C++/CLI、托管C++、或本地C++,都不影响要讲解的主题。)

例1:lib.cpp

using namespace System;
public ref class Test
{
  public:
   void CallMe()
   { 
    Console::WriteLine("called me");
   }
};

将其编译为一个托管库程序集:

cl /clr /LD lib.cpp

在此要多留意,我们是使用了混合模式(/clr)来编译此代码,当然了,如果适当修改,也能以旧式托管C++语法(/clr:oldsyntax)来编译。

下一步,创建一个调用此库的C#程序(例2),当然也可以使用Visual Basic.NET,不过C#更好一点。再与库一起编译:

例2:

using System;
class App
{
  static void Main()
  {
   Test test = new Test();
   test.CallMe();
  }
}
csc app.cs /r:lib.dll

运行此程序,会抛出一个异常:

Unhandled Exception:
System.IO.FileNotFoundException:
The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
at App.Main()

怎么会这样呢?打开程序所在的目录,库也在那啊。HRESULT的高位字为0x8007,其代表FACILITY_WIN32,也就是说,这是一个Win32错误;低位字以十进制表示为126,在winerror.h中列明其代表ERROR_MOD_NOT_FOUND。如果LoadLibrary不能查找到某个模块,才会返回这个错误结果,因此,现在非常清楚了,这个错误表示不能查找到一个非托管的DLL。

时间: 2024-11-17 05:32:10

C++/CLI中有效使用非托管并列缓存的相关文章

对象-java中io等非托管资源close与赋值为null有什么区别

问题描述 java中io等非托管资源close与赋值为null有什么区别 io操作如果没有close而直接赋值为null有什么后果,而close之后又没有赋值为null,也就是还有对象的引用,那这个对象会不会释放内存,垃圾回收器会不会回收它 Reader reader = new InputstreamReader(new FileInputStream()); 如果reader.close()关闭了reader的资源 则FileInputStream的资源有没有关闭 ,没关闭的话如何关闭 解决

WPF中嵌入的非托管exe无法修改窗体样式且无法响应mousemove和mousewheel消息

问题描述 RT,我在WPF中用HwndHost将非托管exe嵌入到border控件里,但嵌入后的exe无法通过Win32Api改变样式,且无法响应MouseMove和MouseWheel消息 解决方案 解决方案二:别沉了啊,求大神帮帮忙

在ASP.NET中使用非托管COM组件

asp.net|托管     众所周知,ASP.net是基于通用语言运行库创建的,也就是所谓的托管执行环境.生成的代码称为托管代码.编译器能够从源代码的描述中产生元数据信息,而运行库又从元数据中获得托管代码的信息.而我们编写的组件一般是在非托管环境下创建的,这些组件往往不包含元数据信息,那么我们怎么在托管代码中使用这些元数据信息呢?      为了在托管环境中使用非托管代码,我们首先必须手工为这些现有的组件产生元数据信息 .必须有一种工具能够产生元数据.能够从某个地方获得元数据.这个元数据的发源

C#调用非托管动态库中的函数

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern "C" __declspec(dllexport) int add( int , int ); int add( int a, int b) { //实现这个函数returna+b; } 注意上面代码,一定要加上 extern&

wpf win32-WPF中嵌入非托管exe无法响应mousemove和mousewheel消息

问题描述 WPF中嵌入非托管exe无法响应mousemove和mousewheel消息 RT,我在WPF中用HwndHost将非托管exe嵌入到border控件里,但嵌入后的exe无法通过Win32 Api改变样式,且无法响应MouseMove和MouseWheel消息

如何在C#中监听COM组件(非托管)中对象启动事件?

问题描述 如何在C#中监听COM组件(非托管)中对象启动事件? 诸位前辈,晚上好: 我是一名硬件工程师,最近使用原理图绘图工具时发现有些功能不好用,就准备自己开发插件增强一下,其中遇到了这样一个问题: 我在 C# 项目中加入 COM 组件的引用,原理图程序的 COM 对象是 ViewDraw,在其启动时,会创建一个 ViewDraw.Application 的对象,这个对象中有一些子成员和方法,以及一些事件.我现在通过以下方法已经可以做到此原理图程序启动后获取此活动对象: ViewDraw.Ap

cpp-请问非托管C++中是否可以调用C#的函数

问题描述 请问非托管C++中是否可以调用C#的函数 请问一个项目里面可不可以创建CS文件和CPP文件,并在CPP文件中调用CS文件中的类方法. 解决方案 当然可以,将你的C#程序包装成com对象,用regasm注册. 在你的C++中CoCreateInstance像调用COM对象那样就可以用 http://www.360doc.com/content/12/1218/08/9200790_254706077.shtmlhttp://www.codeproject.com/Articles/126

C#调用非托管C++DLL中的函数接口

问题描述 C#调用非托管C++DLL中的函数接口(有生成的DLL文件和Lib文件)怎么引用?引用项添加不了 解决方案 解决方案二:使用DllImport,添加引用只能针对.NET控件或COM组件.解决方案三:DllImport具体搜p/Invokehttp://www.cnblogs.com/xuqiang/archive/2010/12/21/1953355.html解决方案四:C++DLL中的函数中还调用了openCV的函数,能说一下怎么整么?解决方案五:引用3楼qq_28744297的回复

.NET应用技巧:非托管COM组件的使用

众所周知,asp.net是基于通用语言运行库创建的,也就是所谓的托管执行环境.生成的代码称为托管代码.编译器能够从源代码的描述中产生元数据信息,而运行库又从元数据中获得托管代码的信息.而我们编写的组件一般是在非托管环境下创建的,这些组件往往不包含元数据信息,那么我们怎么在托管代码中使用这些元数据信息呢? 为了在托管环境中使用非托管代码,我们首先必须手工为这些现有的组件产生元数据信息.必须有一种工具能够产生元数据.能够从某个地方获得元数据.这个元数据的发源地就是类型库,事实上,今天所有的组件都有一