C#对COM类的方法调用导致应用程序崩溃

C#对COM类的方法调用导致应用程序崩溃,c#,c++,com,C#,C++,Com,我有一个调用COM类的C#Winforms应用程序。当使用VisualStudio调试时,它会进入C++代码并返回SyOK,但当函数返回VisualStudio挂起和应用程序崩溃时。我必须在VS进程上结束进程以停止程序运行。如果我在visual studio之外运行应用程序,应用程序就会崩溃 一切正常,我不知道我做了什么导致了这个问题 感谢您的帮助。谢谢 Sj 这是接口定义 typedef struct { long ExpiryData BSTR IssuedBy;

我有一个调用COM类的C#Winforms应用程序。当使用VisualStudio调试时,它会进入C++代码并返回SyOK,但当函数返回VisualStudio挂起和应用程序崩溃时。我必须在VS进程上结束进程以停止程序运行。如果我在visual studio之外运行应用程序,应用程序就会崩溃

一切正常,我不知道我做了什么导致了这个问题

感谢您的帮助。谢谢

Sj

这是接口定义

typedef struct
{
    long    ExpiryData
    BSTR    IssuedBy;
} LicenceData;

[
    object,
    uuid (5A734F95-EABE-440B-8B7E-0F73538A24AC), 
    pointer_default(unique),
    helpstring("ILicenceReader Interface"),
]
interface ILicenceReader : IDispatch
{
    HRESULT ReadLicenceFile ([in, out]LicenceData* plicenceData, LPCTSTR filePath);
};

[
    uuid(C2833A21-6586-4648-ABC8-D42BC3225699)      
]
coclass LicenceReader
{
    [default] interface ILicenceReader;
};
我引用了COM dll,并允许VS在c#应用程序中生成互操作和用法:

LicenceData data = new LicenceData();

ILicenceReader reader = new LicenceReader();

reader.ReadLicenceFile(ref data, filePath);

谢谢您的帮助。

我敢打赌,COM子系统正在尝试解组堆栈上分配的BSTR,或者可能在堆栈上分配了智能指针

必须使用SysAllocString分配BSTR。由此产生的结果可以按原样返回,因为它不在堆栈上,没有任何东西会试图错误地释放它

如果使用智能指针BSTR类,如CComBSTR或_BSTR_t,则需要通过分离设置IssuedBy成员。CComBSTR::Detach()将返回指向BSTR的指针,并且在CComBSTR的本地实例超出范围时不会尝试释放它

plicenceData->IssuedBy = CComBSTR("Some Dude").Detach();
另一种可能性是,您尝试在COM类中执行类似于plicedata=new plicedata的操作,覆盖传入的实例。那不行

最后,COM函数完成并返回后失败的唯一原因几乎是编组问题。这是你的C代码和被调用的C++之间的层,它试图在公寓中转换数据,并可能处理边界。您需要确保严格遵守COM规则,以允许编组完成其工作


所以,仔细检查你所有的指针。它们是在堆栈上还是在堆上?他们需要在堆上。是否所有BSTR都已适当分配?使用智能BSTR类通常会有很大帮助,但请记住,您不能返回原始成员。按预期使用这些类。

我敢打赌COM子系统正在尝试解组堆栈上分配的BSTR,或者可能在堆栈上分配了智能指针

必须使用SysAllocString分配BSTR。由此产生的结果可以按原样返回,因为它不在堆栈上,没有任何东西会试图错误地释放它

如果使用智能指针BSTR类,如CComBSTR或_BSTR_t,则需要通过分离设置IssuedBy成员。CComBSTR::Detach()将返回指向BSTR的指针,并且在CComBSTR的本地实例超出范围时不会尝试释放它

plicenceData->IssuedBy = CComBSTR("Some Dude").Detach();
另一种可能性是,您尝试在COM类中执行类似于plicedata=new plicedata的操作,覆盖传入的实例。那不行

最后,COM函数完成并返回后失败的唯一原因几乎是编组问题。这是你的C代码和被调用的C++之间的层,它试图在公寓中转换数据,并可能处理边界。您需要确保严格遵守COM规则,以允许编组完成其工作


所以,仔细检查你所有的指针。它们是在堆栈上还是在堆上?他们需要在堆上。是否所有BSTR都已适当分配?使用智能BSTR类通常会有很大帮助,但请记住,您不能返回原始成员。按预期使用这些类。

也许您可以提供有关正在进行的COM调用的详细信息?此外,有关操作系统、CPU体系结构(32位对64位)、编译CPU体系结构(AnyCPU对x86)等的信息都可能会有所帮助。能否显示COM函数的签名、如何在C#中声明以及如何调用它?请将调试器配置为在SEH上停止(菜单->调试->VS异常)。在附加调试程序的情况下运行应用程序,但不要使用逐步执行。查看将报告什么异常我打开了所有异常,但它仍然会杀死visual studio。它在64位Windows7机器上运行。目标平台是c#应用程序和COM dll中的x86。函数调用传回一个stuct by ref,其中包含一些字符串和int。@Sjblack,请向我们展示IDL文件以及操作中涉及的所有接口和类的对应C#定义。也许您可以提供有关正在进行的COM调用的详细信息?此外,有关操作系统、CPU体系结构(32位对64位)、编译CPU体系结构(AnyCPU对x86)等的信息都可能会有所帮助。能否显示COM函数的签名、如何在C#中声明以及如何调用它?请将调试器配置为在SEH上停止(菜单->调试->VS异常)。在附加调试程序的情况下运行应用程序,但不要使用逐步执行。查看将报告什么异常我打开了所有异常,但它仍然会杀死visual studio。它在64位Windows7机器上运行。目标平台是c#应用程序和COM dll中的x86。函数调用传回一个stuct by ref,其中包含一些字符串和整数。@Sjblack,向我们展示IDL文件以及操作中涉及的所有接口和类的相应C#定义