我正在尝试使用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.对象不支持此属性或方法。我检查了其他答案,无法得到我的问题的答案。
答案 0 :(得分:2)
consume
是一个静态方法,COM不支持任何支持静态方法的实例方法和属性。从代码中删除static
。
您的消费方法也将始终返回一个空字符串。您在任务中陈述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);
}
}
答案 1 :(得分:0)
一些事情。在VBA代码中,Consumer意味着两件事(netConsumer的变量和容器);这至少会引起混淆。
无论如何,外部消费者是什么? (那个不是变量的那个。)它从C#代码看起来应该是netConsumer。你怎么样把这个类导出到COM呢? (关于命名空间和类名的错误内容按照下面的shf301编辑出来。)
第三,因为consume()是一个静态方法,为什么还要创建一个netConsumer呢?