- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个需要从非托管 C++ 调用的 C# dll。我遇到的主要问题是我的 C++ 代码对应于一个 excel 加载项,可以为 excel 2003 和 excel 2007 安装,当我在 excel 2007 中安装我的加载项时,我尝试调用我的 C# dll,它工作得很好,但由于某种原因我仍然无法找到,在 excel 2003 中它崩溃了,excel 向我显示运行时错误消息,并且在调试我的 c++ 代码时我可以看到代码在尝试时失败创建我的 C# dll 的一个实例,它说即使我用 regasm 注册了该类也没有注册。
这是我的 C# 代码:
namespace ManagedDLL
{
[
Guid("3C80EE60-D9B8-4daf-89BE-6C7B748F613C"),
InterfaceType( ComInterfaceType.InterfaceIsDual),
ComVisible(true)
]
public interface ICalculator
{
[DispId(1)]
int main(string args, IntPtr _handle);
};
[
Guid("5134F342-5B7F-4db2-94F0-F450610419CF"),
ProgId("myapp.CCOMEntryPoint"),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(ICalculator)),
ComVisible(true)
]
public class COMEntryPoint : ICalculator
{
public int main(string args, IntPtr _handle)
{
string[] _args = args.Split(new char[] { ':' });
Program.handle = _handle;
return Program.Main(_args);
}
}
}
在 C++ 中,我所做的是导入使用 regasm 注册我的 C# dll 时生成的 .tlb 文件,如下所示:
\#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
.
.
.
int callMyDll()
{
long handle = 0, result = 0;
BSTR args;
HRESULT hr = CoInitialize(NULL);
ICalculatorPtr pICalc(__uuidof(COMEntryPoint));
pICalc->main(bstrStr, handle, &result);
return result;
}
但正如我之前提到的,这段代码不适用于 excel 2003,所以我的问题是:
谢谢
最佳答案
我以前遇到过类似的问题。我不是从 C++ 调用 C#,但概念是一样的。
我必须通过 COM 将 .NET dll 加载到主机应用程序中,这看起来就像您正在尝试做的那样。问题是主机应用程序(在您的例子中是 excel)正在加载 .NET runtime 1.1。我们的 dll 是为 .NET 2.0 编译的。
可能是 Excel 2003 加载了 1.1 运行时,而 2007 加载了更新的版本。看看这个论坛: Excel selects wrong .NET runtime .
您也可以使用 MSBee 进行测试以 1.1 运行时为目标,然后尝试在 Excel 2003 中加载您的 dll。
关于c# - 如何使用 IDispatch 从非托管 C++ 调用 C# dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473520/
我目前正在开发一个 COM 服务器(使用 ATL)供闭源 VB 使用应用。到目前为止一切正常,但我想确保没有泄漏那里...所以我的问题是: 我是否必须在通过以下方式获得的 IDispatch 指针上调
我想枚举一台机器上的所有 IDispatch 支持对象。目前我需要知道类 ID 或程序 ID 是什么,但是为了检查我的机器,我想知道我是否可以枚举所有实现 IDispatch 的对象。 这可能吗? 任
我有一个 ATL COM 组件,它引发一些由托管(C# 和 VB.NET)代码处理的事件。该组件当前由 VS2005 VB.NET 项目(作为 ActiveX 控件)使用,并且引发了所有事件并且一切正
我正在使用 ATL 将旧的 VB COM 对象(不是我写的)转换为 C++。根据 IDL,其中一种方法采用 IDispatch* 作为参数,此方法的文档和示例声称您可以传递一个字符串(这是一个对象的
我一直在考虑尝试使用实现 OPOS 服务对象的 C# 编写 COM 对象。我已经使用 Automation 和 MFC 在 C++ 中完成了它,这并不太难。所以我一直坚持尝试将其转换的方法之一。我将排
我用一个简单的 COM 对象编写了一个简单的 COM DLL inproc 服务器。 COM 对象实现了一个连接点。 我知道如何创建从 IDispEventImpl 派生的 ATL 客户端,并使用接收
在第三方 COM 模块中,我必须将结构传递给方法。 IDL 定义的重要部分如下所示: interface ITheirInterface : IDispatch { [id(0x0000012
我在我的 C++ 程序中托管一个 IWebBrowser2 控件,只使用普通的 Win32(没有 mfc、atl、wtl 等)。在 DISPID_NAVIGATECOMPLETE2 上,我添加了一个自
我在返回 HRESULTS 的 WMI/WBEM 接口(interface)上调用方法。我想向用户显示这些错误代码的有意义的错误消息。但是,当我查找 HRESULT 的错误消息时,我只得到类似“IDi
今天我带来了另一个让我头疼的问题, 我确实将一个 DAO 3.6 类型库导入到我的 delphi 7 中,并且我开始看到许多有趣的接口(interface),所以我面临着一个有趣的问题。 每次Fiel
如何在Delphi中释放IDispatch COM对象?我必须这样做吗? type IUtility = interface(IDispatch); var obj: IUtility; beg
如果我使用错误的参数数量/类型通过 IDispatch(后期绑定(bind))调用 COM 对象的方法,是否会返回一些错误代码,或者程序会崩溃或出现其他故障?我只想知道使用 IDispatch 进行后
明天我计划做一些 IDispatch 相关的工作,我将不得不创建一个支持这个接口(interface)的类。 我一直在使用 ATL 类来创建 COM 对象和管理 COM 指针,所以我也想将它们用于我的
我有一个函数,它通过参数(项目)返回一个指向接口(interface)指针的指针: CreateProject(std::string str, IDispatch** project); 鉴于另外两
我一直在用 C# 开发 Web 服务,以将网站与本地数据库链接起来。本地应用程序的 SDK 是一个 COM 对象。第二天,我开始思考如何将下面的 VB 代码(在 SDK 协议(protocol)中给出
继续 this question ,我很困惑 IDispatch::Invoke() 上的 DISPID_VALUE 是否可以将脚本函数和属性(在我的例子中是 JavaScript)视为调用实际函数的
我在使用 IDispatch.Invoke 调用具有浮点参数和浮点结果的函数时遇到问题。 这是一个最小的复制: #include #include int main(int argc, char*
我不知道是否有人熟悉 BHO(浏览器助手对象),但是 c++ 专家也可以帮助我。 在我的 BHO 中,我只想在主框架上运行 OnDocumentComplete() 函数 - 第一个容器,而不是当前页
我正在编写一些测试代码来模拟调用我的延迟绑定(bind) COM 对象的 C# 实现的非托管代码。我有一个声明为 IDispatch 类型的接口(interface),如下所示。 [Guid("2D
我是物理学家。我正在尝试使用导入的 activex 控件(ocx 文件)在 Delphi 上工作。假设库中有 3 个自动化接口(interface):IGraph、IGraphAxes 和 IAxis
我是一名优秀的程序员,十分优秀!