如题,有没有象在VC 6.0中的那样不用拷到运行目录下,只要本机注册过com就能运行的方法?我看到VS2005中引用com也是生成了一个Interop开头的dll,而且运行目录下必须存在才能运行的。求教大家了。

解决方案 »

  1.   

    好像不能直接用,需要转成Interop开头的dll,除非com用.net写的
      

  2.   

    是你的C#程序在编译时自动生成的dll最小集,且在debug目录下
      

  3.   

    GAC全称是Global Assembly Cache
      作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。 
      除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly: 
      1)创建一个strong-name的Assembly,例如ToolbarComponent.dll 
      2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC 
      3)在程序中动态装载: 
      System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f"); 
      MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache); 
      在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil -l"查到。 
      另外,上面提到了GAC中的Assembly必须是strong-name的。创建strong-name的Assembly的步骤大致如下: 
      a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。 
      b) 在VS.NET里面修改“AssemblyInfo.cs”文件: 
      [assembly: AssemblyDelaySign(false)] 
      [assembly: AssemblyKeyFile("..\\..\\keyPair.snk")] 
      c) 编译项目,就能得到一个strong-name的Assembly。 
      MSDN中有一些对GAC的介绍,您可以参考: 
      1)《Assembly Cache Viewer (Shfusion.dll)》 
      2)《Global Assembly Cache》 
      .NET Framework中附带了一些和GAC有关的工具,其中包括: 
      1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly 
      2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image 
      3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。
      

  4.   


    这是误人子弟!
    跟是否是.net写的无关,即使是.net写的,也需要拷贝到当前目录。
    平时只所以不需要,因为那是在GAC里面,你自己写一个dll,然后另写一个程序引用,你看需不需要拷贝!楼主,如果你不希望拷贝到当前目录,解决办法是
    1。注册到GAC
    2。不引用COM组件,直接反射调用——Type.GetTypeFromProgId,当然,反射调用并不方便,而且有一些限制。所以如果你只是调用com中的少量方法,你可以去反射。
      

  5.   

    呵呵,这么个问题 那看看System.dll不复制在当前目录下照样运行的好好的!
    你再找找看regsvr32是干嘛的。不管什么办法都是让程序能够找到它运行时需要用到的所有文件,如dll
      

  6.   


    如果是net写的,继承了ServiceComponent,就是com+组件,编译的dll 只要regsvr32到Com组件服务里就可以了,而如果是vb或者vc写的,需要用Tlbimp.exe工具导入,就会生成interop开头的dll,当然你在vs studio里直接引用,它会自动调用此工具生成。
    这位兄弟说的是dll应该放在哪里,跟楼主问的问题好像不搭界吧,是谁在误人子弟啊。
      

  7.   

    至于说dll放在哪里,那不是com的问题,任何用v.net写的dll,要么在运行目录下,要么gac到全局缓存里,要么通过assembly指定路径load进来使用,跟是不是com组件没有关系。
      

  8.   

    一般都是直接引用进来,应该也可以注册进GAC,一般来说dll都很小引用进执行路径就可以了,