如何引用位于另一个文件夹中的libraby

时间:2016-01-14 13:53:42

标签: c# .net dll c++-cli

我有一个名为app1.exe的应用程序,它从一个名为CodeToCall.dll的DLL库中调用一个函数。在生产环境中,我的库位于另一个属于另一个程序的文件夹中。当我运行我的应用程序时,它会抛出以下异常:

  

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'dllToCall,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。系统找不到指定的文件       at main(String [] args)
      在mainCRTStartupStrArray(String [] arguments)

我引用的Dll可能正在使用某些库,但无法加载。

我试图在Windows PATH中包含dll文件夹,但它没有成功,是引用dll的正确方法

我的CodeToCall.dll代码:

public class Class1
{
    public void Some()
    {
        Console.WriteLine("HI");
    }
}

我的app1.exe,当我添加codeToCall.dll

作为参考时
int main(array<System::String ^> ^args)
{
    //PCWSTR wcstr = L"C:\Program Files(x86)\Sigma"
    Console::WriteLine(L"Hello World");
    dllToCall::Class1^ obj = gcnew class dllToCall:Class1;
    obj->Some();
    Console::ReadKey();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您可以通过订阅AppDomain::AssemblyResolve事件从任意文件夹加载程序集。装配分辨率的一个很好的概述是here

简而言之:

  • 当运行时无法在任何常用位置找到您引用的程序集时,AppDomain::AssemblyResolve事件将会触发。
  • 在事件处理程序中,检查事件args(ResolveEventArgs::Name)以确保.NET实际上要求您要加载的程序集。
  • 在事件处理程序中,现在由您来加载程序集,通常使用对Assembly::LoadFrom的调用,这允许您提供CodeToCall.dll的完整路径。
  • 如果Assembly::LoadFrom成功,它将返回新加载的程序集的句柄。您必须从AssemblyResolve事件处理程序返回该句柄。

(您可能很想在您的应用首次启动时直接致电Assembly::LoadFrom,但仅此一项不起作用 - 您必须从{返回程序集的句柄{1}}处理程序。)

示例:

AppDomain::AssemblyResolve