2012-07-27 143 views
1

我在嘗試獲取某個類的屬性值時遇到了一些麻煩。實施結構如下:將system._comobject轉換爲.net字符串

  1. C#編寫的一個COM對象具有COM可見包裝類,使得與標記有ComVisible特性(假)屬性使用兩類。
  2. 從傳統的ASP頁面調用COM對象來執行一些工作。

非COM可見類有一些.NET類型的屬性(主要是字符串類型)。問題是當在類中的各種方法中訪問這些屬性時,屬性返回System._ComObject作爲它們的值而不是它們的實際內容。我已經嘗試使用ToString(),明確地將它們轉換爲它們的.NET類型,並且在獲取屬性的類型後也使用InvokeMember()。但是,當使用InvokeMember時,似乎沒有給出屬性的實際內容值,這給出了某些屬性的實際內容。我得到的是System._ComObject。

所以我的問題是我如何獲得這些屬性的實際值,而不是隻獲取System._ComObject?

更新1:

的代碼示例我在做什麼:

[ComVisible(false)] 
public class Node 
{ 
    public int Id 
    { 
     get; 
     set; 
    } 
    public string Name 
    { 
     get; 
     set; 
    } 
    public string DataType 
    { 
     get; 
     set; 
    } 
    } 

[ComVisible(false)] 
public class Builder 
{ 
    public Node Root; 
    ASPTypeLibrary.Response response; 
    public void SetUpProperties(object resp, string name, string dataType){ 
     response = (ASPTypeLibrary.Response)resp; 
     Root = new Node(); 
     Root.Name = name; 
     Root.DataType = dataType; 
     response.Write(Root.Name.ToString()); // This works fine 
     response.Write(Root.DataType.ToString()); // This works fine 
     PrintNode(); 
    }  

    public void PrintNode() 
    { 
    response.Write(Root.Name.ToString()); // This works fine. Prints actual content. 
    response.Write(Root.DataType.ToString()); // This prints System._ComObject 
    } 
} 

[ComVisible(true)] 
public class Wrapper 
{ 
    /* Required constructors are definded */ 

    public void Start(object resp) 
    { 
    Builder bld = new Builder(); 
    bld.SetUpProperties(resp, "Node 1", "Type 1"); 
    } 
} 

生成器類實例化和setProperties方法()是從一個在傳統的ASP創建的包裝類稱爲頁面使用Server.CreateObject()。 System._ComObject打印在PrintNode()中。我不確定除了ToString()之外還有什麼其他方法可以用來獲取屬性的內容。

感謝,

+0

請添加一些代碼來說明您所描述的內容(從描述中不難理解您正在做什麼,或者您在哪裏看到System._ComObject實例)。 .NET類的字符串值屬性總是返回String實例。你的代碼中還有其他一些東西正在發生。 – 2012-07-27 15:35:41

+1

不存在將字符串文字「類型1」變形爲System .__ ComObject的情況。你的代碼片段沒有意義。麻煩製造者應該是* resp *。 – 2012-07-27 16:48:47

回答

0

你有沒有嘗試過這樣的:System.Runtime.InteropServices.Marshal.PtrToStringBSTR()