在C主机CLR中使用C#dll或注册COM互操作,Visual Studio 2010

在C主机CLR中使用C#dll或注册COM互操作,Visual Studio 2010,c#,.net,c,visual-studio-2010,msdn,C#,.net,C,Visual Studio 2010,Msdn,正如上面所描述的,我想在我的C程序中使用DLL。我考虑的前两个方案是: 1。主机CLR 我的问题是文章中的注释: 不推荐使用.NET Framework 4之前的.NET Framework版本提供的宿主方法。我们建议您使用.NET Framework 4引入并在本主题中讨论的接口 在我的例子中,DLL文件在.NETFramework2.0下工作,因此这首先可能是个问题 有人知道我能不能做到吗 2。注册COM互操作 另一个选项是使用COM。在这种情况下,我需要知道在VisualStudio2

正如上面所描述的,我想在我的C程序中使用DLL。我考虑的前两个方案是:

1。主机CLR

我的问题是文章中的注释:

不推荐使用.NET Framework 4之前的.NET Framework版本提供的宿主方法。我们建议您使用.NET Framework 4引入并在本主题中讨论的接口

在我的例子中,DLL文件在.NETFramework2.0下工作,因此这首先可能是个问题

  • 有人知道我能不能做到吗
2。注册COM互操作

另一个选项是使用COM。在这种情况下,我需要知道在VisualStudio2010中,COM互操作选项注册的具体内容。DLL文件是我们公司也提供给客户的库的一部分。所以我需要知道的是:

  • 哪些附加信息存储在DLL中
  • 公司不想为COM互操作注册其DLL的原因是什么
谢谢你提供的任何信息

要回答您的问题: 1。在您的流程中,您肯定可以托管2.0。Jeffrey Richter建议通过C#在其CLR的2.0版中使用。这在最新版本的框架中被弃用,因此产生了混乱。我建议走这条路

2.COM互操作-要使其正常工作,您实际上需要更改库,添加一些属性,然后注册生成的COM对象,等等。我非常确定它会添加对一些封送拆收器和其他COM相关内容的引用。我肯定会尽可能远离COM。这项技术的缺点是最初提出.Net的原因之一。如果您将这些dll发送给任何人,则更是如此。

要回答您的问题: 1。在您的流程中,您肯定可以托管2.0。Jeffrey Richter建议通过C#在其CLR的2.0版中使用。这在最新版本的框架中被弃用,因此产生了混乱。我建议走这条路

2.COM互操作-要使其正常工作,您实际上需要更改库,添加一些属性,然后注册生成的COM对象,等等。我非常确定它会添加对一些封送拆收器和其他COM相关内容的引用。我肯定会尽可能远离COM。这项技术的缺点是最初提出.Net的原因之一。如果您将这些dll发送给任何人,则更是如此。

使用Regasm.exe(又名“注册COM互操作”)可以完成两件事:

  • 它记录DLL所在的位置,以便可以自动找到它。您只需在自己的代码中使用一个数字,即GUID
  • 它记录运行代码所需的CLR版本。你会自动得到正确的答案
所以它解决了你想要解决的问题:)当然不是巧合。自行托管CLR的优势在于,您可以调用任何.NET代码,而不仅仅是[ComVisible]类型的代码。这不是一种避免学习如何编写COM代码的方法,托管接口和调用.NET代码所需的主要.NET接口(如_Assembly)也是基于COM的。使用C++代替C++是最好的避免的残酷和异常惩罚。< /P> < P>使用Reasas.EXE(AKA登记COM互操作)有两件事:

  • 它记录DLL所在的位置,以便可以自动找到它。您只需在自己的代码中使用一个数字,即GUID
  • 它记录运行代码所需的CLR版本。你会自动得到正确的答案

所以它解决了你想要解决的问题:)当然不是巧合。自行托管CLR的优势在于,您可以调用任何.NET代码,而不仅仅是[ComVisible]类型的代码。这不是一种避免学习如何编写COM代码的方法,托管接口和调用.NET代码所需的主要.NET接口(如_Assembly)也是基于COM的。使用C++代替C++是残酷和不寻常的惩罚,最好避免。< / P>选项3:选项3:谢谢!很高兴知道这一点,并感谢您解决了第1点的困惑!我想我会选择CLR解决方案。谢谢!很高兴知道这一点,并感谢您解决了第1点的困惑!我想我会选择CLR解决方案。那么您建议使用这个选项吗?我对CLR还没有真正的概念。我所知道的是,我有很大的C类库,我必须在C程序中使用它们——不幸的是,我不能在这里选择其他语言,因为这两个项目都相当大。。有没有一个关于如何做到这一点的例子,我可以看一下?有很多关于它的书,史蒂文·普拉奇纳的很好。您找到示例C代码的几率很低。残酷和异常低。试图将C项目移植到托管C++是一种选择吗?我不知道这是否可行,但是既然C是C++的子集,这应该是可行的。它不是完全不可能的,但“相当大”是不祥的词。它当然不会神奇地将C代码变成托管代码。是的,我看到clr只理解对象。。所以C代码是不可编译的。我已经在寻找另一种解决方案——可能是通过网络发送命令——只是为了避免搞乱这个问题。那么您建议使用这个选项吗?我对CLR还没有真正的概念。我所知道的是,我有很大的C类库,我必须在C程序中使用它们——不幸的是,我不能在这里选择其他语言,因为这两个项目都相当大。。有没有一个关于如何做到这一点的例子,我可以看一下?有很多关于它的书,史蒂文·普拉奇纳的很好。你永远不会放弃的可能性