C# 如何通过该';s位于另一个文件夹中
我有一个名为app1.exe的应用程序,它正在调用一个名为CodeToCall.dll的dll库中的函数。在生产环境中,我的库位于属于另一个程序的另一个文件夹中。当我运行应用程序时,它会引发以下异常: 未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“dllToCall,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。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
在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进行故障排除。