项目是用VB 6.0开发的asp组件。目前要对原组件某个方法添加线程功能,为了避免重写代码,故采用导入原组件,再用C#开新的线程方式运行原主件的方法。编写完成,却发现报告称原来写的已经在Com+管理器中部署的组件没有含有强名称,编译失败。
各位谁曾经遇到过这样的问题?应该如何解决?
//已经导入组件using System;
using System.Threading;
using System.Runtime.InteropServices;//为了调用GUID
using System.EnterpriseServices;//引用COM+的类
using uti_LetterLib;  //组件namespace uti_DotnetTools
{
[Guid("5E0E8F5D-19E5-4913-9E36-A2BBC78D844B")]
public class LetterTools: ServicedComponent
{
private uti_LetterLib.Sender send =new uti_LetterLib.SenderClass(); //组件里面的主类
private string filePath="";
public void SetNoteItem(uti_LetterLib.NoteItem noteItem){
send.NoteItem=noteItem;
}
public void printThread(){
send.PrintLetter(this.filePath,false);
} public void PrintLetter(string filePath){
this.filePath=filePath;
Thread t1 = new Thread(new ThreadStart(printThread)); 
t1.Start();
}
}
}

解决方案 »

  1.   

    sn -k yourkey.snk然后添加到assemblyinfo.cs里
    [assembly:assemblikeyfile("yourkey.snk")]然后编译应该就可以了
      

  2.   

    在我自己的项目里面已经有了
    [assembly: AssemblyKeyFile("..\\..\\keyfile.snk")]现在我的项目引用了另外一个dll,这个dll是以前用vb写的,可以引入系统中。但是这个dll当然没有强命名,于是编译不能通过,原因就是原来哪个dll没有强名称。我想那就算了,干脆从微软的Word的com组件直接来做(我是要封装成dll打印word文件),但是引入系统的Word组件也是没有强名称。要怎么解决原来哪个dll没有强名称的问题?
      

  3.   

    using Word;.................
    .................
    .................object fileName = "c:\\1.doc";
    object readOnly = false;
    object isVisible = true;
    object missing = System.Reflection.Missing.Value;
    Word.ApplicationClass oWordApp = new Word.ApplicationClass();Word.Document oWordDoc = oWordApp.Documents.Open(ref fileName, 
    ref missing,ref readOnly, 
    ref missing, ref missing, ref missing, 
    ref missing, ref missing, ref missing, 
    ref missing, ref missing, ref isVisible, 
    ref missing,ref missing,ref missing);oWordDoc.PrintOut(ref missing,ref missing,ref missing,ref missing,
    ref missing,ref missing,ref missing,ref missing,ref missing,
    ref missing,ref missing,ref missing,ref missing,ref missing,
    ref missing,ref missing,ref missing,ref missing);oWordApp.Application.Quit(ref missing, ref missing, ref missing);
    oWordApp=null;以上代码没有语法错误,就是原来的Word的组件没有强名称,不能编译生成com的dll
      

  4.   

    呵呵我以前也遇见过类似的问题哈解决办法是再建一个装配件包含你要用的那个没有强名的dll然后把这个新的装配件弄成有强名的就行了
      

  5.   

    chijingde(AD),我想你应该可以理解我现在的心情。能给出具体的操作步骤吗??按部就班地操作步骤
      

  6.   

    使用/keyfile或/keycontainer命令行开关:
    tlbimp XXX1.dll /out:XXX2.dll /keyfile:sn.snk使用Gacutil /i XXX2.dll注册这个dll到全局缓冲
    到VS.NET引用这个dll
      

  7.   

    在 XXX1.dll 没有强名的情况下把它变成另外一个有强名的XXX2.dll然后使用XXX2.dll如果这个方法不行那咱们说的就不是一回事了
      

  8.   

    我说的意思是你的意思,我昨天测试了你这种方法了。
    不知道你是用什么来管理COM组件的,我是用系统的Com+服务管理器来管理的。<控制面板> -> <Component Services>来管理的。
    我对Word的dll进行操作
    在用库转换工具tlbimp 转化之前,可以添加MSO.DLL到Com+管理器中,经过如下转化:
    tlbimp mso.dll /out:mso2.dll /keyfile:keyfile.snk
    转换后的MSO2.DLL在添加到管理器中时,出现如下错误:
    One or more files do not contain components or type libraries. There files cannot be installed.没有添加成功。顺便问的:
    用Gacutil添加到全局程序集缓存,添加到Com+管理器,用reg.. 命令注册dll组件,3者有小量区别吧?
      

  9.   

    .net跟COM是不兼容
    在.net里使用COM .net会给你生成一个代理组件
    .net里只有装备件的概念
    高速缓冲区,是.net管理装配件的一个工具
    你可以在系统目录下的assembly目录找到它
    咱们好像说的还真不是一回事……
    我以前遇到的是在.net里使用COM
    你这里是要使用COM+组件转化完后的那个是.net生成的代理组件,不能往组件服务里放了,但是可以放到高速缓冲里刚才看了下书,在.net里使用COM+的步骤好像麻烦点
    除了要提供装配件属性、提供强名、在高速缓冲区注册装配件外
    如果是未受管制的代码中想使用装配件里的类,必须在所有的客户端执行之前,显示的注册带有COM+服务的装配件(Regsvcs.exe)另外为了能使装配件跟事务服务一起工作,还必须对.net类进行组装
    主要有两项内容
    1:必须用属性修改代理类,以指出代理类的事务支持级别
    2:必须给类添加代码,以控制类参与事务时的行为
    具体的你看看微软的文档
    或者看看我手头的这本书《C#高级编程》第20章 COM+ 服务
      

  10.   

    你先把tlbimp转化后的那个代理组件注册到高速缓冲区里然后在程序里使用它试一下看能不能用如果不行的话明天帮你一起试哈先下班了:)
      

  11.   

    事情的起因:
      asp调用VB写的组件,asp页面需要根据已经有的word文件模板自动生成新的word文件再打印。生成和打印的速度比较慢,影响asp的使用。于是想开发一个新组件,具有后台开线程的方式解决。我尝试的方案系列:
    1.用C#从注册到系统的VB的COM组件中导入组件,然后把组件作为一个类成员,从外部给这个组件加一个壳。
    该方案遇到了强名称的问题,用TlbImp给原来的组件转换以后,编译确实能通过,但是不能部署。我觉得:
    (1)组件的作用是在系统中注册,在系统的任何一个地方要用,只要提供这个组件的名字或者GUID就可以生成组件来调用。
    (2)依赖于组件B的组件A能发布到系统中,因为组件B已经发布到系统中了
    (3)现在在C#环境下,组件B已经注册过了。组件A要调用组件B,组件A有强名称,组件B没有。用TlbImp.exe来给组件B符上强名称,那么这个
    组件B1和原来的组件B应该不是一样的吧?还需要不需要注册?我试图注册这个组件B1,但是没有成功。同样,组件A也没有注册成功。
    (4)我测试的注册方式是在《控制面板》系统管理工具里面的《组件服务》中的注册。2.在VB中调用API开线程,通过网上查的代码没有成功。3.用VC采用建立ATL组件的方式,从原来的COM组件中继承一个新类,在VC中开线程后再调用父类的方法。编译通过,执行过程中,感觉根本没有调用父类方法。我现在只求能解决问题就可以....
      

  12.   

    如果是asp调用的话个人觉的用C#去写根本没必要asp直接调用COM\COM+ 就好了用.net写还要进行转换,不划算不过用.net做出来的倒是有个好处那就是将来aspx也能调用:)
      

  13.   

    你先把tlbimp转化后的那个代理组件注册到高速缓冲区里
    然后在程序里使用它试一下看能不能用试了没?能用不?
      

  14.   

    ……呵呵忘记了说了转换完的组件不能用COM\COM+的注册方式进行注册了
    由于你要在整台机器上运行所以要先把它装载到高速缓冲区里  gacutil/i  XXX.dll然后用.net提供的工具注册  RegAsm XXX.dll
      

  15.   

    呵呵太好了,可以。操作步骤:(1)sn -k keyfile.snk
    (2)tlbimp test.dll /out:test2.dll /keyfile:keyfile.snk
    (3)Gacutil /i MyTest3.dll
    (4)导入库到C#程序,和平时一样用,最后生成dll,再部署到Com服务中
    谢谢aspx要用vb写的组件,不要转换,直接和引入工程就可以。
    aspx是很方便的。只是讨厌的合同要维护很久。没办法啊