none
请问在C#2.0的程序里可以调用C#4.0开发的dll吗? RRS feed

答案

  • 用require吧
    <configuration>
    ...
    <startup>
          <requiredRuntime version="4.0.30319" safemode="true"/>
    </startup>
    ...
    </configuration>


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 mldark 2010年4月16日 11:00
    2010年4月16日 2:44
    版主

全部回复

  • 没试过,帮顶

    2010年4月14日 11:39
  • 可以



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月15日 22:05
    版主
  • 啊,蒋晟<abbr class="affil">啊,我好像在CSDN见过你,我是白途思啊,呵呵。</abbr>

    我研究了很久,很难啊。2.0调用4.0够呛,CSDN上也没人有办法。

    试过引用不行,反射也不行,COM吧,说.net的COM只能引用。

    我现在真的是没辙了。


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月16日 0:31
  • 你的2.0程序要在CLR 4.0上运行,也就是在config里面加

    <configuration><startup><supportRuntime version="4.0.20506"/></startup></configuration>

    这样才可以运行依赖于CLR4.0的代码。

    另外,.Net 4.0中去除了一些功能,比如CAS安全设置。显式指定CLR 2.0 CAS安全设置的程序集需要去掉CAS安全设置之后重新编译才可以被CLR 4.0加载。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月16日 0:43
    版主
  • 非常感谢您的回复。

     

    我在主程序 控制台exe(.net2.0)的配置文件中加入:

        <startup>
          <supportRuntime version="4.0.30319"/>
        </startup>

    程序中反射调用..net4.0的一个dll(它没有关联其他更多的dll)。

    Assembly.LoadFile报错:

    ex = {"生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。 (异常来自 HRESULT:0x8013101B)"}

    改用Assembly.LoadFrom报错

    ex = {"未能加载文件或程序集“file:///F:\\My Documents\\Visual Studio 2010\\Projects\\TestB\\bin\\Debug\\testb.dll”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。"}

     

    至于直接引用reference,会出提示框,然后引用集有个小叹号。

    var t = new CB();

    编译报错:

    Error    3    The type or namespace name 'CB' could not be found (are you missing a using directive or an assembly reference?)  

     

    至于您说的,CAS安全设置,我不知道在哪里去掉。

    再次感谢您的帮助,期待您的回复!


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月16日 1:09
  • 用require吧
    <configuration>
    ...
    <startup>
          <requiredRuntime version="4.0.30319" safemode="true"/>
    </startup>
    ...
    </configuration>


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 mldark 2010年4月16日 11:00
    2010年4月16日 2:44
    版主
  • 非常非常感谢您!2.0的exe主程序调用4.0的dll(通过反射)的方法基本解决了。

    但是这种方法要写配置文件。

     

    我现在的情况是,主程序是exe(不知道用什么开发的),可以调用托管的dll。

    但是似乎只支持.net2.0/3.5的dll,4.0的就报错。

    我想通过2.0的dll,调用4.0的dll,这种配置文件法似乎不奏效。

    不知道可以在编写2.0的dll的代码里指定requiredRuntime version可以吗?

     

    再次非常非常感谢您,真是不好意思又要麻烦您!


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月16日 5:45
  • 您可以试着创建一个 *.dll.config 然后指定 requiredRuntime。.NET 4.0 引入 In-Process Side By Side,它使得不同 CLR 运行时的程序集可以运行在同一个进程当中。

    如果不知道 EXE 怎么开发的,可以用 Reflector 打开看看,如果是 .NET 开发的,就可以直接用 .exe.config 了。


    Mark Zhou
    2010年4月16日 9:13
  • 感谢您的提醒,我看了这方面的介绍。

    但据我的理解In-Process Side By Side是C#4兼容低版本的程序,而低版本的.net是不具有这个能力,

    是不是说就不能实现我想的低版本dll加载高版本的dll

    我尝试使用 *.dll.config 和 requiredRuntime,但是似乎没有效果。

    采用2.0的dll反射调用4.0的dll

    LoadFrom报错:

    Could not load file or assembly 'file:///E:\MyDocuments\Visual Studio 2010\Projects\NX6_Open_CS_Wizard1\TestC\bin\Debug\TestC.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

    Assembly.LoadFile报错:

    ex = {"This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded. (Exception from HRESULT: 0x8013101B)"}

     

    我想请教一下,LoadFrom有很多参数,可不可以设置一下调用4.0的dll?

    再次表示感谢!


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月16日 13:10
  • 要选择不同版本的CLR的话,只有用非托管的CLR HostAPI了。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月16日 13:50
    版主
  • 非常感谢您的回复。

     

    我查了一下宿主程序的机制,似乎是非.net程序开发的exe,通过一个nxclrldr.dll(C开发的),只有一个函数,就调用ManagerLoader.dll(.net2.0)。难道这个nxclrldr.dll里实现的调用就是用到您所说的CLR HostAPI?

    而ManagerLoader.dll因为是.net开发的,我用reflector看到他的代码,是.net没错。我提取了它的代码,在.net4下重新编译,但是它不能被nxclrldr.dll加载。

    我想问一下CLR HostAPI实现的调用和COM调用有什么区别吗?


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月16日 15:46
  • msdn.microsoft.com/en-us/library/9x0wh2z3(VS.90).aspx

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月16日 15:53
    版主
  • 最后还有个小问题

    如果是用应用程序域的话,有没有可能实现2.0调用4.0的dll间调用

    会不会比CLR HostAPI简单些?


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月17日 1:13
  • 你也可以用COM来做接口,4.0的CLR可以和2.0的共存,不过这样不但是跨应用程序域而且是跨了CLR,互操作会比较慢。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月17日 4:04
    版主
  • 谢谢蒋老师!

    我试了,C#4.0的dll做成COM,注册。

    C#2.0的project里Add reference的COM,点击Add后,提示不能使用,必须引用。

    可是引用高版本的dll,是有小叹号的,而且不能使用。


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月17日 4:23
  • 没有regasm么?不是加程序集引用是加COM引用

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月17日 4:27
    版主
  • regasm注册了。Visual studio 在project属性的Debug里可以选择自动注册为COM,就是这个。

     

    在2.0的dll project中Add Reference的COM里能看到,但是就是不让引用,

    “Add a reference to the .net assemebly instead."


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月17日 4:39
  • 用regasm /tlb生成类型库再引用类型库

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月17日 5:09
    版主
  • 使用tlb Add reference,依然是说这是重.net导出的COM

    “Add a reference to the .net assemebly instead."


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月17日 5:36
  • 用tlbimp生成一个互操作DLL看看。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月17日 5:44
    版主
  • 也不行,导入出错。

     

    Microsoft (R) .NET Framework Type Library to Assembly Converter 3.5.30729.1
    Copyright (C) Microsoft Corporation.  All rights reserved.

    TlbImp : error TI0000 : The input file 'E:\MyDocuments\Visual Studio 2010\Projec
    ts\ex_vs10_被低版本调用\NX6_Open_CS_Wizard1\bin\Debug\ug.dll' is not a valid typ
    e library.


    我的技术博客:http://blog.csdn.net/begtostudy
    2010年4月17日 6:06
  • 嗯,看起来不用这么麻烦

    你用一个文本编辑器打开csproj文件,然后编辑引用的属性,加上 <SpecificVersion>True</SpecificVersion>就可以了。

    假定你的.Net 4类库名是ClassLibrary1的话,这个引用看起来是这个样子:

    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">

          <Project>{A6EB8D5E-5C2F-44D6-AF2E-C00D74025329}</Project>

          <Name>ClassLibrary1</Name>

          <SpecificVersion>True</SpecificVersion>

        </ProjectReference>

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月17日 14:03
    版主
  • 再次感谢蒋老师!

    看来真的是没有办法了。

    我在2.0的dll项目中引用4.0的dll后,改变  <SpecificVersion>True</SpecificVersion>,现在编译没有问题了。

    但是调用的时候依然报错,说是运行时库比现在的新。

     

    我想估计是没辙了,但是COM是不受运行时库影响的,Visual Studio不让我引用(Add Reference 的COM),这个真的很烦人。我能不能通过代码显示调用4.0的COM的dll??


    我的第一技术博客
    2010年4月18日 0:25
  • 再次感谢蒋老师!

    看来真的是没有办法了。

    我在2.0的dll项目中引用4.0的dll后,改变  <SpecificVersion>True</SpecificVersion>,现在编译没有问题了。

    但是调用的时候依然报错,说是运行时库比现在的新。

     

    我想估计是没辙了,但是COM是不受运行时库影响的,Visual Studio不让我引用(Add Reference 的COM),这个真的很烦人。我能不能通过代码显示调用4.0的COM的dll??


    我的第一技术博客
    2010年4月18日 0:25
  • 这个方法是需要设置requiredRuntime为CLR4.0的。

    理论上应该可以用COM做中转的,不过IDE不让你加而已。要不用像IE和Office那样用非托管COM类型库作为中转?这样需要你自己写idl之后用midl生成tlb。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月18日 1:16
    版主