C#的项目视图,选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sample4Lib;
namespace UseCom
{
class Program
{
static void Main(string[] args)
{
//Fun pf = new Fun();//OK now
IFun pf = new Fun();
var a = pf.Add(2, 3);
IFun f1 = pf as IFun;
}
}
}
调用的时候,new Fun()这句没有问题,而var a=pf.Add这句出问题了。如下图所示。
我的这个com组件是VC实现的,主要代码如下:
idl文件内容:
[
object,
uuid(906AA3B5-7341-455F-B391-AD6D15087701),
pointer_default(unique)
]
interface IFun : IUnknown{
[] HRESULT Add([in] LONG n1, [in] LONG n2, [out,retval] LONG** pVal);
};
[
uuid(197CE716-F985-4C7A-B202-7FFB27E6B3A0),
version(1.0),
]
Fun.cpp中的函数实现:
STDMETHODIMP CFun::Add(LONG n1, LONG n2, LONG** pVal)
{
// TODO: Add your implementation code here
*pVal=new LONG;
**pVal=n1+n2;
return S_OK;
}
这个com组件用一个VC写的客户段调用是没有问题的,能运行。但是用我写的C#程序来调用就不行。如果我把Add函数的返回值类型改为LONG* pVal,不改变指针本身,那么VC客户端经过小修改也能运行,而我的C#调用程序还是会遇到同样的问题。
这到底是为什么呢?
还请指教!
2 个解决方案
#1
你的C代码不全,没看到你FuncClass怎么继承的IFun。
#2
看你那个代码,想问接口能够实例化吗?你调用Add()应该不是那么样调用吧
#1
你的C代码不全,没看到你FuncClass怎么继承的IFun。
#2
看你那个代码,想问接口能够实例化吗?你调用Add()应该不是那么样调用吧