C++ 库在 vb6 中有效,但在 c# 中无效

Posted

技术标签:

【中文标题】C++ 库在 vb6 中有效,但在 c# 中无效【英文标题】:C++ library works in vb6 but not in c# 【发布时间】:2010-02-08 17:07:34 【问题描述】:

我正在编写一个 C# 应用程序,它必须使用我的客户提供的 C++ api。该库在被 vb6 应用程序引用时工作正常,但是当我在我的 c# 应用程序中引用它并尝试调用相同的方法时,我得到了不同的(错误的)行为。我调用的方法需要几个字符串参数。如果我没有库的源代码,我只能猜测可能出了什么问题,这导致我想到以下想法:库是否可能被设计为只能从 vb6 调用?例如,我的意思是,它可能期望字符串参数以某种不同于 c# 使用的方式编码。如果是这样,是否有任何解决方法?到目前为止,我能做的最好的事情是创建一个 vb6 包装器 ocx,但它并不优雅,而且最不易于部署的解决方案。

我正在发布初始化对象的代码:


        ApiPrnClass apiprn;      // this is the class imported form the com reference
        for (int j = 0; j < 10; j++)
        
            apiprn = new ApiPrnClass();  
            apiprn.FMGetModel(_TIPODISPOSITIVO.iDocument);
            apiprn.FMPRNFormat(_TIPODISPOSITIVO.iDocument, _TIPOFORMATO.DEL_CONDENSED, "");
            apiprn.PRNBeforePrint(_TIPODISPOSITIVO.iDocument, "");

            for (int i = 0; i < 10; i++)
            
                
                string linea = "TEST C/ BUFF XXX-----------------------".Replace("XXX", (10 * j + i).ToString().PadLeft(3, '0'));
                apiprn.FMPrint(_TIPODISPOSITIVO.iDocument, linea);
            

            
            apiprn.PRNAfterPrint(_TIPODISPOSITIVO.iDocument);
            System.Threading.Thread.Sleep(1000);
        

如果有任何帮助,我将不胜感激, 谢谢, 伯纳贝

【问题讨论】:

你能给我们看看 C++ API 的声明和你的 VB6 声明吗? 我相信它是 com,尽管我不必注册它。我能够将它添加到 vb 和 c# 作为参考。 【参考方案1】:

我无法相信问题的原因,我自己找到了。我意识到从 c# 控制台应用程序调用该库时运行良好,但从 winforms 使用时出错(之前没有提到它,它是一个旨在打印票证的库)。我知道这两种类型的应用程序之间可能存在的唯一区别是控制台应用程序运行一个专用于运行代码的线程,而 winforms 去检查事件队列。看起来这个库的代码太扭曲了,以至于它无法支持这种切换。所以我尝试从 Windows 应用程序中调用该库,但在另一个线程中......它成功了!

无论如何,感谢所有的答案, 伯纳贝

【讨论】:

以上是关于C++ 库在 vb6 中有效,但在 c# 中无效的主要内容,如果未能解决你的问题,请参考以下文章

存储过程有效,但在 c# 中给出无效列

动态对象变量的 C# 索引在方法中有效,但在返回时无效,错误 C50021

HTTP 请求在 Postman 中有效,但在 C# 代码中无效

为啥强制转换 SQL MAX(DateTime) 命令在 SSMS 中有效,但在 C# 中无效? [复制]

重复的 typedef - 在 C 中无效但在 C++ 中有效?

C# 中的 WMI 无效查询,但在 wbemtest 实用程序中有效