Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当有人说“什么意思?”;C“程序应使用单线程单元”与非托管COM代码通信”;_C# - Fatal编程技术网

C# 当有人说“什么意思?”;C“程序应使用单线程单元”与非托管COM代码通信”;

C# 当有人说“什么意思?”;C“程序应使用单线程单元”与非托管COM代码通信”;,c#,C#,什么是非托管COM代码?单人公寓呢?谢谢大家! 它的意思是,“以下是你应该查找并理解的关键短语”。不,这不是一句刻薄的话。这些概念既复杂又复杂,单个文本框不是解释它们的合适位置 你也可以问某人他/她是什么意思 同时,你可以阅读和理解。它的意思是,“以下是你应该查找和理解的关键短语”。不,这不是一句刻薄的话。这些概念既复杂又复杂,单个文本框不是解释它们的合适位置 你也可以问某人他/她是什么意思 同时,你还可以阅读和阅读。长话短说: 非托管COM代码意味着该代码没有可用的垃圾收集器。COM代码处理自

什么是非托管COM代码?单人公寓呢?谢谢大家!

它的意思是,“以下是你应该查找并理解的关键短语”。不,这不是一句刻薄的话。这些概念既复杂又复杂,单个文本框不是解释它们的合适位置

你也可以问某人他/她是什么意思

同时,你可以阅读和理解。

它的意思是,“以下是你应该查找和理解的关键短语”。不,这不是一句刻薄的话。这些概念既复杂又复杂,单个文本框不是解释它们的合适位置

你也可以问某人他/她是什么意思


同时,你还可以阅读和阅读。

长话短说:

非托管COM代码意味着该代码没有可用的垃圾收集器。COM代码处理自己的内存,.NET垃圾收集器不应尝试收集该内存

单线程单元是一种模型,其中每个COM消息在对象之间进行序列化/反序列化。消息通过windows消息传递模型传输,因此COM对象不需要关心线程安全问题。在多线程单元中,发送到对象的消息可以随时发生,因此对象必须是线程安全的


这是一个非常简单的解释。关于单线程公寓的更多详细信息。

长话短说:

非托管COM代码意味着该代码没有可用的垃圾收集器。COM代码处理自己的内存,.NET垃圾收集器不应尝试收集该内存

单线程单元是一种模型,其中每个COM消息在对象之间进行序列化/反序列化。消息通过windows消息传递模型传输,因此COM对象不需要关心线程安全问题。在多线程单元中,发送到对象的消息可以随时发生,因此对象必须是线程安全的


这是一个非常简单的解释。关于单线程公寓的更多细节。

正如西南所说,这是一件相当复杂的事情。但我将尝试从历史的角度提供一些见解

在.Net之前,COM是Microsoft为开发人员提供的一种方法,可以构建常用对象,并让它们在多个程序和程序实例之间工作。糟透了。它会一直卡住。它会泄漏内存。这会使服务器崩溃。找个时间查一下“DLL地狱”。你可以从你的服务器上完全注销一个DLL,然后注册它的新版本,你猜怎么着?COM有时会顽固地保留DLL,即使重新启动也不会杀死它

后来.Net出现了,它的一个伟大之处在于它解决了COM所面临的许多问题。.Net直接控制的任何东西(即,在.Net框架内/使用.Net框架构建的任何东西)都称为“托管”代码。“非托管”代码是其他任何代码


当你听到类似“C#程序应该使用单线程单元与非托管COM代码通信”这样的话时,这是.Net的说法,“如果你想让我使用你讨厌的、老式的、危险的、穴居人COM对象,那么你需要以一种不会在崩溃时杀死我的方式来做。“

正如西南所说,这是一件相当复杂的事情。但我将尝试从历史的角度提供一些见解

在.Net之前,COM是Microsoft为开发人员提供的一种方法,可以构建常用对象,并让它们在多个程序和程序实例之间工作。糟透了。它会一直卡住。它会泄漏内存。这会使服务器崩溃。找个时间查一下“DLL地狱”。你可以从你的服务器上完全注销一个DLL,然后注册它的新版本,你猜怎么着?COM有时会顽固地保留DLL,即使重新启动也不会杀死它

后来.Net出现了,它的一个伟大之处在于它解决了COM所面临的许多问题。.Net直接控制的任何东西(即,在.Net框架内/使用.Net框架构建的任何东西)都称为“托管”代码。“非托管”代码是其他任何代码


当你听到类似“C#程序应该使用单线程单元与非托管COM代码通信”这样的话时,这是.Net的说法,“如果你想让我使用你讨厌的、老式的、危险的、穴居人COM对象,那么你需要以一种不会在崩溃时杀死我的方式来做。“

这意味着您的主方法前面应该有[StatThread]属性,例如

[STAThread]
public void Main(string[] args) { ... }
这将强制主线程使用单元线程模型,这是COM组件所需要的


这一切在令人痛苦的技术细节中真正意味着什么,如果上述方法奏效,可能会也可能不重要;-)

这意味着您的main方法前面应该有[STAThread]属性,例如

[STAThread]
public void Main(string[] args) { ... }
这将强制主线程使用单元线程模型,这是COM组件所需要的


这一切在令人痛苦的技术细节中真正意味着什么,如果上述方法奏效,可能会也可能不重要;-)

查看stackoverflow的回答,了解STA与MTA的区别:

我的2美分:
AFAIK(大师,如果我错了,请纠正我)在windows线程模型中,GUI始终是单线程的,MS只是想在.net中继续使用它,从而在主线程上使用STA属性。您的工作线程可以是MTA。但是,您的主线程(GUI线程)必须是STA,以允许它与其他程序通信,例如内置COM。

查看stackoverflow上的这个答案,了解STA与MTA的关系:

我的2美分: 阿法克(大师,如果我错了,请纠正我)和窗户