1

我一直在尝试为高性能密集型程序监控视频内存。

所以我在 C++ Visual Studio 应用程序中使用了 NVIDIA CUDA 库来收集我需要的数据。

不幸的是,我需要一个可以与 Ruby、C# 和我公司拥有的软件测试工具一起使用的包。

所以我决定编译一个 C++ DLL 并将其导入到 C# Visual Studio 项目中进行测试。

我能够编译 DLL,但将其导入我的 Visual C# 程序一直是个问题。

我右键单击参考 - >添加参考。然后我单击浏览选项卡并浏览到我的 DLL 的位置;“TestProgram.dll”,我点击“确定”

然后我收到以下错误消息“无法添加对 C:.... 的引用。请确保该文件可访问,并且它是有效的程序集或 COM 组件。”

到目前为止我所尝试的: 1. 从我系统上的几个不同位置导入 DLL。2. 将 DLL 移动到我的解决方案资源管理器中并导入它 3. 使用“Invoke”方法:[DllImport("PathToMyDll")] 4. 仅使用我的 dll 名称使用“Invoke”方法。5. 键入我的 DLL 的“使用”路径 6. 将 dll 导出为 .lib 文件

我究竟做错了什么?我认为如果我使用 Visual Studio 2010 导出 DLL,那么肯定可以将相同的 DLL 添加到 Visual Studio 2010 项目中。

4

2 回答 2

1

那么,它是有效的程序集还是 COM 组件?仅仅因为它是一个 C++ DLL 并不意味着它可以仅作为一个参考使用,事实上,大多数都不能。它需要是托管 DLL 或 COM 对象。如果不是这些,那么您必须从托管程序集中调用非托管代码。这意味着在存根中定义每个函数。

更多信息:如何从 C# 调用 C++ dll 导出函数

请注意,您还必须处理 64/32 位问题,因为如果 DLL 是为 32 位编译的,则不能在 64 位应用程序中使用它。

于 2013-04-10T00:34:00.803 回答
0

我找到了解决这个问题的方法。CUDA 创建一个 Windows 控制台应用程序项目。所以解决方案是只使用它而不是 DLL。

这很有效,因为 Ruby、Test Complete 和 Visual C# 可以读取基本 .exe 控制台程序的输出(需要一些工作)。

编译的exe很简单。我需要做的就是在启动程序时传入一个整数作为参数,程序将从我的 NVIDIA 卡中获取我需要的数据。

现在的挑战是找到与 .exe 交互的好方法。

于 2013-04-10T16:31:44.083 回答