Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


2 questions online user: 15

0
votes
answers
60 views
+10

Marshal.SizeOf()無法計算包含字符串的對象的大小

0

Marshal.SizeOf()將在嘗試計算MyClass類型的對象的長度時引發異常。Marshal.SizeOf()無法計算包含字符串的對象的大小

這裏是類:

<StructLayout(LayoutKind.Sequential, Pack:=1)> 
Public Class MyClass 

    Public ReadOnly UniqueId As Long 

    <MarshalAs(UnmanagedType.AnsiBStr, SizeConst:=60, SizeParamIndex:=0)> 
    Public ReadOnly Name As String 

End Class 

該代碼將失敗:

Dim MyObject = New MyClass() 
Dim size = Marshal.SizeOf(MyObject) 'will throw exception here. Why? 

它會拋出異常「任何有意義的大小或偏移量可以計算」

我怎樣才能取而代之的是MyObject的長度?

+0

什麼平臺你正在使用 – Adrian

+0

這個問題似乎與'AnsiBStr'。 'BStr' /'LPStr' /'LPWStr'似乎很好https://stackoverflow.com/questions/64714??21/marshal-c-char-in-c-sharp – Slai

+0

我正在編譯到x64 Windows中的AnyCPU。 –

沙发
0
0

我相信UnmanagedType.AnsiBStr只能用於方法簽名的參數(傳遞值)。

對BSTR的引用是指向長度前綴字符數組的指針。因此,它將是一個.Net Intptr,其大小爲4或8個字節,具體取決於進程位(x32或x64)。如果您需要ANSI字符,可以定義爲StructLayout聲明的一部分並標記字符串作爲UnmanagedType.BStr

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Ansi)> 
Public Class [MyClass] 
    Public ReadOnly UniqueId As Long 
    <MarshalAs(UnmanagedType.BStr)> 
    Public ReadOnly Name As String 
End Class 

推薦閱讀:

板凳
0
-1

即時通訊設法幫助。馬歇爾用於值類型例如:結構類別引用類型這是不需要計算內部未使用的對象。你需要使用ex:struct來完成它的工作。我給我的代碼的例子,但對不起,我寫在C#

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestingData p = new TestingData(); 
     Console.WriteLine("Number of bytes : {0}", Marshal.SizeOf(p)); 
    } 
} 

public struct TestingData 
{ 
    public string a; 
} 

希望它的幫助。欲瞭解更多信息,你可以去這裏Marshal Documentation

0
votes
answers
30 views
+10

C#線程問題

1

是否有有關調用unmanaged代碼時使用多線程的一些普遍性的建議?C#線程問題

我隨機收到訪問衝突錯誤,顯然挖入unmanaged代碼沒有多大意義。

是否有一些方法我可以嘗試的,而不是把這些調用到某種一個critical section,以消除衝突錯誤?

+1

訪問衝突錯誤並不一定是* *的多線程問題,至少不是當你寫不安全代碼的結果。你是否明確地創建了多個線程,還是隻是假設它一定是問題?調試器告訴你什麼? – 2011-05-10 13:49:31

沙发
0
1

這取決於您所調用的非託管組件是否已編程爲線程安全。

如果並行調用這個代碼,只有當獲得訪問衝突,它看起來像你正在使用的不是線程安全的組件。

使用C#lock()聲明,以確保安全:

private static readonly myLockObject = new object(); 

... 

lock (myLockObject) 
{ 
    CallMyUnsafeCode(); 
} 
+1

那麼,我最終意味着什麼時候談論「關鍵部分」。不管怎麼說,還是要謝謝你 – 2011-05-10 13:53:09