C#中CreateObject的等效代码
Posted
技术标签:
【中文标题】C#中CreateObject的等效代码【英文标题】:Equivalent code of CreateObject in C# 【发布时间】:2012-11-23 01:31:01 【问题描述】:我在 VB6 中有一个代码。谁能告诉我如何在C#
中写它。这段代码如下:
Set Amibroker = CreateObject("Broker.Application")
Set STOCK = Amibroker.Stocks.Add(ticker)
Set quote = STOCK.Quotations.Add(stInDate)
quote.Open = stInOpen
quote.High = stInHigh
quote.Low = stInlow
quote.Close = stInYcp
quote.Volume = stInVolume
Set STOCK = Nothing
Set quote = Nothing
在 C# 中 CreateObject
的等价物是什么?我尝试添加对 com 对象的引用,但我找不到任何作为 Broker.Application 或 amibroker 的 com 对象
【问题讨论】:
类似novicksoftware.com/TipsAndTricks/… 的东西。如果您使用的是 .NET4.0,则可以使用 dynamic 来访问它的成员。 【参考方案1】:如果您使用.net 4 或更高版本,因此可以使用dynamic
,您可以非常简单地执行此操作。这是一个使用 Excel 自动化界面的示例。
Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
dynamic ExcelInst = Activator.CreateInstance(ExcelType);
ExcelInst.Visible = true;
如果你不能使用动态,那就更混乱了。
Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
object ExcelInst = Activator.CreateInstance(ExcelType);
ExcelType.InvokeMember("Visible", BindingFlags.SetProperty, null,
ExcelInst, new object[1] true);
试图做很多这样的事情会耗尽你的生命线。
如果您可以使用早期绑定调度而不是如上所示的后期绑定,那么 COM 会容易得多。您确定找不到 COM 对象的正确引用吗?
【讨论】:
对于那些像我一样遇到编译问题的人,请务必参考 Microsoft.Csharp 和 System.Core。 这适用于 32 位和 64 位 Excel 吗?还是 .Net 实例需要匹配 Excel 位数? @Turn Excel 耗尽进程,因此您不需要任何位匹配【参考方案2】:如果您使用 .NET Framework 4.0 及更高版本,则可以使用此模式:
public sealed class Application: MarshalByRefObject
private readonly dynamic _application;
// Methods
public Application()
const string progId = "Broker.Application";
_application = Activator.CreateInstance(Type.GetTypeFromProgID(progId));
public Application(dynamic application)
_application = application;
public int Import(ImportType type, string path)
return _application.Import((short) type, path);
public int Import(ImportType type, string path, string defFileName)
return _application.Import((short) type, path, defFileName);
public bool LoadDatabase(string path)
return _application.LoadDatabase(path);
public bool LoadLayout(string path)
return _application.LoadLayout(path);
public int Log(ImportLog action)
return _application.Log((short) action);
public void Quit()
_application.Quit();
public void RefreshAll()
_application.RefreshAll();
public void SaveDatabase()
_application.SaveDatabase();
public bool SaveLayout(string path)
return _application.SaveLayout(path);
// Properties
public Document ActiveDocument
get
var document = _application.ActiveDocument;
return document != null ? new Document(document) : null;
public Window ActiveWindow
get
var window = _application.ActiveWindow;
return window != null ? new Window(window) : null;
public AnalysisDocs AnalysisDocs
get
var analysisDocs = _application.AnalysisDocs;
return analysisDocs != null ? new AnalysisDocs(analysisDocs) : null;
public Commentary Commentary
get
var commentary = _application.Commentary;
return commentary != null ? new Commentary(commentary) : null;
public Documents Documents
get
var documents = _application.Documents;
return documents != null ? new Documents(documents) : null;
public string DatabasePath
get return _application.DatabasePath;
public bool Visible
get return _application.Visible != 0;
set _application.Visible = value ? 1 : 0;
public string Version
get return _application.Version;
接下来,您必须包装所有 AmiBroker OLE 自动化类。例如包装评论类:
public sealed class Commentary : MarshalByRefObject
// Fields
private readonly dynamic _commentary;
// Methods
internal Commentary(dynamic commentary)
_commentary = commentary;
public void Apply()
_commentary.Apply();
public void Close()
_commentary.Close();
public bool LoadFormula(string path)
return _commentary.LoadFormula(path);
public bool Save(string path)
return _commentary.Save(path);
public bool SaveFormula(string path)
return _commentary.SaveFormula(path);
【讨论】:
【参考方案3】:这是我用来自动化 Amibroker 的 C# 代码中的一个 sn-p(从我走这条路时开始)。您需要参考 System.Runtime.Interopservices
System.Type objType = System.Type.GetTypeFromProgID("Broker.Application");
dynamic comObject = System.Activator.CreateInstance(objType);
comObject.Import(0, fileName, "default.format");
comObject.RefreshAll();
不过,键入一个点不会调出 comObject 内部方法。
关于这种方法,我只能说 - 它有效,就像一个魅力,但远离它,就像大卫所说的那样。我从以下方面获得了这种方法的灵感:
http://www.codeproject.com/Articles/148959/How-the-new-C-dynamic-type-can-simplify-access-to
另外一个攻击角度,你可能想看看(我认为这是早期绑定):
http://adamprescott.net/2012/04/05/net-vb6-interop-tutorial/
希望这至少对您有所帮助。我已经在 Amibroker 和 C# 中使用了这两种方法,但我最终将它们抛在脑后。 COM 和 Amibroker 不能很好地混合。连TJ都这么说。
祝你好运。
【讨论】:
【参考方案4】:ami2py 会将 AmiBroker 数据读入 python。当前版本是 .0.8.1 警告:它仅提供数据的日分辨率。
以下几行代码会将 AmiBroker 中的符号读入 pandas df
import pandas
import ami2py
folder='C:/Program Files/AmiBroker/Databases/StockCharts'
symbol='indu'
df = pandas.DataFrame()
symbolData = ami2py.AmiDataBase(folder).get_dict_for_symbol(symbol)
for z in ['Year', 'Month', 'Day', 'Open', 'High', 'Low', 'Close', 'Volume'] :
df[symbol+':'+z] = symbolData[z]
print(df.describe())
【讨论】:
以上是关于C#中CreateObject的等效代码的主要内容,如果未能解决你的问题,请参考以下文章
此 Canon SDK C++ 代码片段的等效 C# 代码是啥?