如何使用此库的所有引用添加对类库的引用?

时间:2015-09-11 16:11:04

标签: c# .net dll dependencies .net-assembly

我试着解释我的问题。

我有自己的Windows服务( WS )。此 WS Helpers.dll上引用。 Helpers.dll它是我自己的类库,它有多个引用。其中一个引用是System.Web.Mvc.dll

例如,如果我在Helpers.dll上添加对 WS 的引用,则Helpers.dll的所有引用都不会添加到 WS 。(在大多数情况下,这种行为是正确的,我认为)

我试图在Copy Local = TrueSyste.Web.Mvc.dll

的参考属性中设置Helpers.csproj

enter image description here

<Reference Include="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
</Reference>

但是没有任何改变。

如果没有放在Helpers.dll中的引用,我的 WS 无法正常工作。 TypeInitializationException将被扔进rintume。 (异常发生在试图执行AppDomain.CurrentDomain.GetAssemblies()方法的静态构造函数中,其中一个程序集为Helpers.dllSystem.Web.Mvc.dll上有链接

如何使用此库的所有引用添加类库引用?

确切地说,我可以手动在 WS 项目中添加此引用(System.Web.Mvc.dll),我想通过设置或.config文件或其他方式来执行此操作。 / p>

实际上,我使用下面的代码进行动态解析汇编:

任何方式,在解析程序集期间第一次使用AssemblyHelpers类之后,我在 WS 中得到了异常 - 我的 WS 使用Helpers.dll使用System.Web.Mvc.dll dll(此AssemblyHelpers仅放置在Helpers项目的 bin 文件夹中,并且不在 WS 的bin foder中。

但是我的 WS 也使用了System.Web.Mvc.dll类来尝试加载Helpers.dll(首先,自定义程序集解析程序加载dll,然后加载System.Web.Mvc.dll的所有引用{ {1}},包括Description: The process was terminated due to an unhandled exception.Exception Info: System.TypeInitializationException)并获得异常(System.Web.Mvc.dll)。 \

public static class AssemblyHelper { private static readonly object _syncLock = new object(); private static readonly List<Assembly> _assemblies = new List<Assembly>(); public static ICollection<Assembly> SyncronizedList { get { lock (_syncLock) { return new List<Assembly>(_assemblies); } } } static AssemblyHelper() { AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(OnAssemblyLoad); AppDomain.CurrentDomain.DomainUnload += new EventHandler(OnDomainUnload); // explicitly register previously loaded assemblies since they was not registered yet foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { RegisterAssembly(assembly); } } private static void OnAssemblyLoad(object sender, AssemblyLoadEventArgs args) { if (RegisterAssembly(args.LoadedAssembly)) { ExecuteAllExecuteOnAssemblyLoadMethods(args.LoadedAssembly); } } private static void OnDomainUnload(object sender, EventArgs args) { foreach (Assembly assembly in SyncronizedList) { ExecuteAllExecuteOnDomainUnloadMethods(assembly); } } public static bool RegisterAssembly(Assembly assembly) { if (assembly == null) { throw new ArgumentNullException("assembly"); } lock (_syncLock) { if (_assemblies.Contains(assembly)) { return false; } else { _assemblies.Add(assembly); ExecuteAllExecuteOnAssemblyLoadMethods(assembly); return true; } } } private static void OnAssemblyLoad(object sender, AssemblyLoadEventArgs args) { if (RegisterAssembly(args.LoadedAssembly)) { ExecuteAllExecuteOnAssemblyLoadMethods(args.LoadedAssembly); } } private static void OnDomainUnload(object sender, EventArgs args) { foreach (Assembly assembly in SyncronizedList) { ExecuteAllExecuteOnDomainUnloadMethods(assembly); } } public static ICollection<MethodInfo> FindAllMethods(Assembly assembly, Type attributeType) { String assemblyName = "unknown"; String attributeTypeName = String.Empty; try { if (assembly == null) { throw new ArgumentNullException("assembly"); } assemblyName = assembly.FullName; if (attributeType == null) { throw new ArgumentNullException("attributeType"); } attributeTypeName = attributeType.FullName; List<MethodInfo> lst = new List<MethodInfo>(); foreach (Type type in assembly.GetTypes()) { foreach (MethodInfo mi in type.GetMethods( BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { if (Attribute.IsDefined(mi, attributeType)) { lst.Add(mi); } } } return lst; } catch (Exception ex) { //exception } } public static int ExecuteAllMethods(Assembly assembly, Type attributeType) { int count = 0; foreach (MethodInfo mi in FindAllMethods(assembly, attributeType)) { try { mi.Invoke(null, null); count++; } catch (Exception ex) { Trace.WriteLine(string.Format("Failed to execute method {0} of {1}, reason: {2}", mi.Name, mi.DeclaringType, Converter.GetExceptionMessageRecursive(ex))); } } return count; } public static ICollection<MethodInfo> FindAllExecuteOnAssemblyLoadMethods(Assembly assembly) { return FindAllMethods(assembly, typeof(Attributes.ExecuteOnAssemblyLoadAttribute)); } public static ICollection<MethodInfo> FindAllExecuteOnDomainUnloadMethods(Assembly assembly) { return FindAllMethods(assembly, typeof(Attributes.ExecuteOnDomainUnloadAttribute)); } public static int ExecuteAllExecuteOnAssemblyLoadMethods(Assembly assembly) { return ExecuteAllMethods(assembly, typeof(Attributes.ExecuteOnAssemblyLoadAttribute)); } public static int ExecuteAllExecuteOnDomainUnloadMethods(Assembly assembly) { return ExecuteAllMethods(assembly, typeof(Attributes.ExecuteOnDomainUnloadAttribute)); } } 不在 WS 的bin文件夹中。

function onPickerAction(data) {
    if (data.action === google.picker.Action.PICKED) {
        var id = data.docs[0].id;
        var request = new XMLHttpRequest();
        request.open('GET', 'https://www.googleapis.com/drive/v2/files/' + id);
        request.setRequestHeader('Authorization', 'Bearer ' + gapi.auth.getToken().access_token);
        request.addEventListener('load', function() {
            var item = JSON.parse(request.responseText);
            console.log(item);
            downloadFile(item);
        });
        request.send();
    }
} 

2 个答案:

答案 0 :(得分:6)

  

如何使用此库的所有引用添加对类库的引用?

您不应该将每个传递依赖项添加为程序集引用。需要引用从其他程序集导入类型并使其在代码中可用。

我认为真正的问题是将依赖程序集部署到构建文件夹的过程。尝试在问题中使用一些建议:MSBuild doesn't pick up references of the referenced project

处理传递依赖关系(将其正确部署到每个依赖项目)的现代方法是使用包管理器。 NuGet是此目的的事实上的标准。此外,DNX项目系统中的许多创新旨在解决此类问题,并将NuGet包用作一流的构建和部署实体。

答案 1 :(得分:0)

首先,我要感谢@Nipheris提供使用Nuget的答案和建议。使用Nuget真的很有帮助。

无论如何,我一直在收到错误。我认为尝试使用unity而不是自定义依赖解析器(AssemblyHelper类是其中的一部分)帮助器。在我看来,使用自定义依赖解析器一直是我的错误。