2014-02-07 152 views
1

我目前呼叫使用PowerShell以下COM對象,但我有麻煩在代碼轉換爲C#。我知道這應該是相當直接的,可能是一個愚蠢的問題,所以我道歉,如果我看起來像一個白癡。調用COM對象從C#

PowerShell的:

$nDeviceId=517 
$wug = New-Object -ComObject CoreAsp.EventHelper 
$wug.SendChangeEvent(2,$nDeviceId,1) 

當前C#嘗試:

Type type = TypeDelegator.GetTypeFromProgID("CoreAsp.EventHelper"); 
Object application = Activator.CreateInstance(type); 
pplication.GetType().InvokeMember("SendChangeEvent", BindingFlags.InvokeMethod, null, application, new object[]{2,517,1}); 

我明白任何幫助!

更新: 當我運行的C#代碼我沒有收到任何錯誤。

回答

0

工作過弗羅德的回答,我發現了一個名爲CoreASP.dll DLL並試圖導入到我的項目這一點,但收到一個錯誤,該庫是無效的。

我能夠用「類型庫導入」工具,在Visual Studio中的COM類型庫轉換成等價的定義。

command: tlbimp.exe CoreAsp.dll\1 

這創造了另一個DLL「CoreAspiLib.dll」,我是能夠導入到我的Visual Studio項目。

感謝您的Frode領導我正確的方向。

更新:

那麼這種方法有時可行,好像我將不得不調用命令3-4次得到它的正常工作。爲了避免最後我從C#調用PowerShell中的頭痛,確保保持運行空間開放,使我不必重新加載它的後續命令(我可以調用這個函數每分鐘50+次)。

調用腳本1000倍的例子:

Runspace runspace = RunspaceFactory.CreateRunspace(); 

string scriptText = 
     "$wug = New-Object -ComObject CoreAsp.EventHelper;" + 
     "$wug.SendChangeEvent(2,519,1)"; 

runspace.Open(); 
for (int x = 0; x < 1000; x++) 
    { 
      Console.WriteLine("Running Event "+(x+1).ToString()); 
      Pipeline pipeline = runspace.CreatePipeline(); 
      pipeline.Commands.AddScript(scriptText); 
      pipeline.Commands.Add("Out-String"); 
      pipeline.Invoke(); 

      Thread.Sleep(1000); 

    } 

runspace.Close(); 

這似乎是工作時間的100%。

喬我也試過你的方法,並最終以與我的第一次測試相同的結果,沒有錯誤,但功能沒有按預期運行。

1

我不熟悉的COM對象,但在一般的COM組件是通過將它們設爲您的C#項目的引用(請在添加引用對話框中的COM選項卡),並通過使用訪問他們提供的課程。

Best way to access COM objects from C#

+0

是啊,我試圖做到這一點,但無法找到保存COM對象的DLL。我可以在註冊表中看到該對象,但它不提供文件位置。 – vesuvious

2

如果您在使用.NET 4,不介意後期綁定(沒有智能感知,......),你可以使用一個動態對象:

Type type = Type.GetTypeFromProgID("CoreAsp.EventHelper"); 
dynamic application = Activator.CreateInstance(type); 

application.SendChangeEvent(...);