运行时错误438.对象不支持此属性或方法
本文关键字:属性 方法 不支持 对象 运行时错误 | 更新日期: 2023-09-27 18:06:04
我试图使用c# tlb作为参考,然后在VBA中使用该代码。VBA代码看起来像这样:
Sub startConsumer()
Dim Consumer As Consumer.netConsumer
Set Consumer = New Consumer.netConsumer
MsgBox (Consumer.consume())
End Sub
原始的c#代码是这样的:
namespace netConsumer
{
public class netConsumer
{
public static string message;
public static KafkaOptions options = new KafkaOptions(new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"))
{
Log = new ConsoleLog()
};
public static BrokerRouter router = new BrokerRouter(options);
public static string consume()
{
Task.Factory.StartNew(() =>
{
var consumer = new Consumer(new ConsumerOptions("TestHarness3", router));
foreach (var data in consumer.Consume())
{
Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value);
var utf8 = Encoding.UTF8;
message += utf8.GetString(data.Value, 0, data.Value.Length);
ExcelWorksheet.writeToExcel(message);
}
});
return message;
}
}
}
早些时候它是工作的,但现在我得到运行时错误438。对象不支持此属性或方法。我检查了其他答案,也没有得到我的问题的答案。
consume
是一个静态方法,COM不支持任何静态方法,只支持实例方法和属性。从你的代码中去掉static
你的consume方法也总是返回一个空字符串。您在任务中声明您的Consumer
,但您没有等待该任务完成。您要么需要摆脱Task
并同步运行Consumer
,要么将event
添加到netConsumer
类并在任务完成时引发该事件。
public class netConsumer
{
public string message;
public KafkaOptions options = new KafkaOptions(new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"))
{
Log = new ConsoleLog()
};
public BrokerRouter router = new BrokerRouter(options);
public string consume()
{
var consumer = new Consumer(new ConsumerOptions("TestHarness3", router));
foreach (var data in consumer.Consume())
{
Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value);
var utf8 = Encoding.UTF8;
message += utf8.GetString(data.Value, 0, data.Value.Length);
ExcelWorksheet.writeToExcel(message);
}
return message;
}
}
异步事件:
public delegate void ConsumeCompleteHandler(string message);
public class netConsumer
{
public string message;
public KafkaOptions options = new KafkaOptions(new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"))
{
Log = new ConsoleLog()
};
public BrokerRouter router = new BrokerRouter(options);
public void consume()
{
Task.Factory.StartNew(() =>
{
var consumer = new Consumer(new ConsumerOptions("TestHarness3", router));
foreach (var data in consumer.Consume())
{
Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value);
var utf8 = Encoding.UTF8;
message += utf8.GetString(data.Value, 0, data.Value.Length);
ExcelWorksheet.writeToExcel(message);
}
OnConsumeComplete(message);
});
}
public event ConsumeCompleteHandler ConsumeComplete;
protected virtual void OnConsumeComplete(string message)
{
var handler = ConsumeComplete;
if (handler != null) handler(message);
}
}
几件事。在VBA代码中,消费者意味着两件事(netConsumer的变量和容器);这至少会引起混淆。
外部消费者到底是什么?(不是变量的那个。)从c#代码来看,它应该是netConsumer。如何将类导出到COM呢?(关于命名空间和类名的错误内容按照下面的shf301编辑掉了)
第三,既然consume()是一个静态方法,为什么要创建一个netConsumer呢?