Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过该';s位于另一个文件夹中_C#_.net_Dll_C++ Cli - Fatal编程技术网

C# 如何通过该';s位于另一个文件夹中

C# 如何通过该';s位于另一个文件夹中,c#,.net,dll,c++-cli,C#,.net,Dll,C++ Cli,我有一个名为app1.exe的应用程序,它正在调用一个名为CodeToCall.dll的dll库中的函数。在生产环境中,我的库位于属于另一个程序的另一个文件夹中。当我运行应用程序时,它会引发以下异常: 未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“dllToCall,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。 在main(字符串[]args) 在maincrtstartu

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

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“dllToCall,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。
在main(字符串[]args)
在maincrtstartuptrary(字符串[]参数)

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

我尝试将dll文件夹包含在Windows
路径中,但没有成功,这是引用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;
}
int main(数组^args)
{
//PCWSTR wcstr=L“C:\Program Files(x86)\Sigma”
控制台::WriteLine(L“Hello World”);
dllToCall::Class1^obj=gcnewclass dllToCall:Class1;
obj->Some();
控制台::ReadKey();
返回0;
}

您可以通过订阅事件从任意文件夹加载程序集。对装配分辨率的良好概述如下所示

简言之:

  • 当运行时无法在任何常用位置找到引用的程序集时,将触发
    AppDomain::AssemblyResolve
    事件
  • 在事件处理程序中,检查事件args(),以确保.NET实际请求要加载的程序集
  • 在事件处理程序中,现在由您来加载程序集,通常使用对的调用,这允许您提供CodeToCall.dll的完整路径
  • 如果
    Assembly::LoadFrom
    成功,它将返回新加载程序集的句柄。必须从AssemblyResolve事件处理程序返回该句柄
(当应用程序第一次启动时,您可能会直接调用
AppDomain::AssemblyResolve
程序集::LoadFrom,但仅此一项不起作用——您必须从
AppDomain::AssemblyResolve
处理程序返回程序集的句柄。)

例如:

using namespace System;
using namespace System::Reflection;

Assembly^ MyResolveEventHandler(Object^ sender, ResolveEventArgs^ args)
{
    if (args->Name == "CodeToCall, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
        return Assembly::LoadFrom("C:\\Program Files (x86)\\Sigma\\CodeToCall.dll");
    else
        return nullptr;
}

void UseClass1()
{
    auto obj = gcnew CodeToCall::Class1;
    obj->Some();
}

int main(array<System::String ^> ^args)
{
    AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler(MyResolveEventHandler);

    // You can't directly use Class1 in the same method/function
    // that you use to subscribe to AssemblyResolve.
    UseClass1();

    Console::ReadKey();
    return 0;
}
使用名称空间系统;
使用名称空间系统::反射;
程序集^MyResolveEventHandler(对象^sender,ResolveEventArgs^args)
{
如果(args->Name==“CodeToCall,版本=1.0.0.0,区域性=中立,PublicKeyToken=null”)
返回Assembly::LoadFrom(“C:\\ProgramFiles(x86)\\Sigma\\CodeToCall.dll”);
其他的
返回空ptr;
}
无效类别1()
{
auto obj=gcnew CodeToCall::Class1;
obj->Some();
}
int main(数组^args)
{
AppDomain::CurrentDomain->AssemblyResolve+=gcnew ResolveEventHandler(MyResolveEventHandler);
//不能在同一方法/函数中直接使用Class1
//用于订阅AssemblyResolve的。
useclas1();
控制台::ReadKey();
返回0;
}

这完全取决于您如何加载
dll
。这不是
C
,如果没有正确的语言标记,您很难得到答案。此外,避免将代码作为图像发布,将其复制到应答中是。。复杂。@Sinatr你说得对,这是C++/cli,但dll加载机制是sameIt,这是一个简单的“未找到文件”错误,我们不太可能为你找到它。只需确保C++项目与C++项目建立相同的目录。使用Fuslogvw.exe进行故障排除。