![](/img/trans.png)
[英]Microsoft JScript runtime error: Object doesn't support this property or method
[英]Runtime error 438. Object doesn't support this property or method
我正在尝试使用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
。
您正在使用的方法还将始终返回一个空字符串。 您是在任务中说明您的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进行编辑。)
第三,由于consumpt()是静态方法,因此为什么仍要创建netConsumer?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.