Hi,哪位大侠帮帮忙
    我有一个C#程序,有好多动态库,可是我想把动态库分成不同的目录,比如a.dll,b.dll,c.dll放到abc目录下,
    d.dll,e.dll放到de目录下
    原因一是项目dll太多,另外一个原因是还有一些dll因为同名,不好处理,故此只能放到不同目录下,我项目编译时采用添加引用的方式。这是这种方式最后会将dll全部放到根目录下,有没有其他方法可以实现。,      比如我想要的如下
    根目录
       main.exe   (工程项目内部)
       fold1
         a.dll   (工程项目内部)
         b.dll   (工程项目内部)
         c.dll   (工程项目内部)
         mm.dll  (外部dll)
       fold2
         d.dll     (工程项目内部)
         e.dll     (工程项目内部)
         f.dll     (工程项目内部)
         mm.dll     (外部dll与mm名称一致,但是版本号不一致,如mfc.dll之类,但是名称却缺少)
      c#如何引用?请教各位

解决方案 »

  1.   

    点击那个dll,把复制到本地,改为false
      

  2.   


      我是一个解决方案,包含main,a,b, c, d,e,几个工程,因为其中依赖的mm.dll的复杂性,不得不分开目录,我用的编译器是visual studio。能详细解释一下吗?我是初学的
      

  3.   

    1. 主工程添加控件工程,copy local设置为false
    (这个意思是控件工程生成的dll不会copy到主工程下,即不会build一份和exe放在一块。)2. 在主工程里添加一个app.config。配置如下:
    <?xml version="1.0"?>  
    <configuration>  
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>  
      <runtime>  
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
          <!--<probing privatePath="bin;bin2\subbin;bin3"/>-->  
          <dependentAssembly>  
            <assemblyIdentity name="MyCheckBoxCtrl"/>  
            <codeBase href="ExtDlls/MyCheckBoxCtrl.dll" mce_href="ExtDlls/MyCheckBoxCtrl.dll"/>  
          </dependentAssembly>  
        </assemblyBinding>  
      </runtime>  
    </configuration>  
     
    注意:如果是强名称的dll,可以是放在任意位置。没有强名称的dll只能放在exe目录下面的某个子目录。
    比如:exe是在bin/debug,那么可以放在 bin/debug/bin2 或者其他的别的名字的目录里。
      

  4.   


    您说的第一步我基本理解了,刚刚看到那个引用有一个您说的“复制本地”,或者英文是copy local,这个改为false了;
    改好以后发现 其他信息: 未能加载文件或程序集“a, Version=1.0.4188.19679, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
    您说的app.config如何增加,小弟新手
      

  5.   

    就像增加 class 文件一样,在工程里添加新项,选择 application config 
      

  6.   

    刚刚测试了一下,发现还是存在这个问题
    未处理的“System.IO.FileNotFoundException”类型的异常出现在 a.dll 中。其他信息: 未能加载文件或程序集“b, Version=1.0.4188.20148, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
    其实我是dll引用dll
    大概是这样子 exe引用 a.dll, a.dll引用b.dll,c.dll
    我把exe。放到根目录下,a.dll,b.dll,c.dll放到根目录下的一个文件夹下。出现上述错误。
    大侠能再解释清楚点吗,呵呵
    还有我的c.dll其实是visual c++ 的clr编程。
      

  7.   

    visual c++ 的clr编程。>>> 是.net托管的dll还是,C++的非.net托管的native dll?另外注意顺序。b,c肯定要在a前
      

  8.   

    给你提供一个万能引入DLL的方法:
    无论你是想在C#中引用何种语言的DLL都可以使用这个方式。        Object pObj;
            Assembly m_pDotNetAssembly = null;
            Type m_pDotNetExternalType = null;
                        //加载程序集
                        m_pDotNetAssembly = Assembly.Load(DLL文件);
                        //获得对应类的Type
                        m_pDotNetExternalType = m_pDotNetAssembly.GetType(你需要访问的类, true, true);
                        //将Type赋值给pObj
                        pObj = Activator.CreateInstance(m_pDotNetExternalType);                    //获取类的属性,赋值
                        //PropertyInfo m_pPropertyInfo = m_pDotNetExternalType.GetProperty(strClass);
                        //m_pPropertyInfo.SetValue(pObj, "123", null);                    //获得程序集中对应的方法
                        MethodInfo m_MethodInfo = m_pDotNetExternalType.GetMethod(strDoSomeThing);
                        //将方法信息保存到集合
                        DictionaryInfo.dicMemberInfo.Add(m_pDotNetExternalType.FullName, m_MethodInfo);
                        //执行方法
                        strReturn = m_MethodInfo.Invoke(null, objArr).ToString();
    这些是代码,你看下方法,参数我就不一一说明了,可以根据VS的自动提示查看怎么赋值。
      

  9.   

    Object pObj;
            Assembly m_pDotNetAssembly = null;
            Type m_pDotNetExternalType = null;
                        //加载程序集
                        m_pDotNetAssembly = Assembly.Load(DLL文件);
                        //获得对应类的Type
                        m_pDotNetExternalType = m_pDotNetAssembly.GetType(你需要访问的类, true, true);
                        //将Type赋值给pObj
                        pObj = Activator.CreateInstance(m_pDotNetExternalType);                    //获取类的属性,赋值
                        //PropertyInfo m_pPropertyInfo = m_pDotNetExternalType.GetProperty(strClass);
                        //m_pPropertyInfo.SetValue(pObj, "123", null);                    //获得程序集中对应的方法
                        MethodInfo m_MethodInfo = m_pDotNetExternalType.GetMethod(strDoSomeThing);
                        《//将方法信息保存到集合
                        DictionaryInfo.dicMemberInfo.Add(m_pDotNetExternalType.FullName, m_MethodInfo);》这句你用不上
                        //执行方法
                        strReturn = m_MethodInfo.Invoke(null, objArr).ToString();
      

  10.   

    那codebase引用应该没有问题。<dependentAssembly>  
        <assemblyIdentity name="c"/>  
        <codeBase href="bin2/c.dll" />  
    </dependentAssembly> 
    <dependentAssembly>  
        <assemblyIdentity name="b"/>  
        <codeBase href="bin2/b.dll" />  
    </dependentAssembly> 
    <dependentAssembly>  
        <assemblyIdentity name="a"/>  
        <codeBase href="bin2/a.dll" />  
    </dependentAssembly> 
      

  11.   

    看了您的代码,有没有qq号,email 或者其他联系方式,
    帮我指导一下,呵呵
      

  12.   

    呵呵,刚刚尝试这种方法,是可行,就是引用麻烦点,而且这些dll本事都是一个工程,做起来不是很方便。
    还要重新解析一遍接口。
      

  13.   

    先逐个包装,DllImport 的时候加目录,比如
    using System.Runtime.InteropServices;class rfid {
        [DllImport(@"dll\Comm.dll")]
            public static extern
            int Open_Port(byte port);    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Close_Port();    [DllImport(@"dll\Comm.dll")]
            public static extern
            int ReadSerialNum(ref int Serial_Num);    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Identify_6C(int Serial_Num, byte* buf);    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Read_6C(
                int Serial_Num,
                byte* buf,
                byte mem,
                byte addr,
                byte len
            );    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Write_6C(
                int Serial_Num,
                byte* buf,
                byte mem,
                byte addr,
                byte len,
                byte* data
            );
    }
      

  14.   

    using System.Runtime.InteropServices;class rfid {
        [DllImport(@"dll\Comm.dll")]
            public static extern
            int Open_Port(byte port);    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Close_Port();    [DllImport(@"dll\Comm.dll")]
            public static extern
            int ReadSerialNum(ref int Serial_Num);    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Identify_6C(int Serial_Num, byte* buf);    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Read_6C(
                int Serial_Num,
                byte* buf,
                byte mem,
                byte addr,
                byte len
            );    [DllImport(@"dll\Comm.dll")]
            public static extern
            int Write_6C(
                int Serial_Num,
                byte* buf,
                byte mem,
                byte addr,
                byte len,
                byte* data
            );
    }
      

  15.   

    你现在出什么错误?copy local = false 这都是在主工程里设置的,这一点需要注意。工程A <-----(设置B的Copy Local=false)
      |
      +---- 引用 工程B
                  |
                  +---- 引用 工程C