相关疑难解决方法(0)

从C#windows服务调用C++ DLL(非托管代码)(用托管代码编写)

我正在开发一个具有不同组件的C++项目.我们需要将应用程序作为Windows服务启动.该项目是非托管C++代码.我写了一个C#windows服务,还有一个C风格的dll,它有一个启动不同组件的功能,另一个用来阻止它们.该DLL有两个文件,一个头文件和一个.cpp文件:RTSS.h:

namespace PFDS
{
  extern "C" __declspec(dllexport) int runRTS(char*);
}
Run Code Online (Sandbox Code Playgroud)

RTSS.cpp:

using namespace PFDS;
/* ... includes and declarations */
extern "C" __declspec(dllexport) int runRTS(char* service_name)
{
   g_reserved_memory = (char*) malloc(sizeof(char) * RESERVED_MEMORY_SIZE);
   _set_new_handler(memory_depletion_handler);
   // this function is from a C++ .lib which is included in
   // the linker input for the RTSS dll project setting.
   // SetUnhandledExceptionHandler("RTS");       
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Windows服务的ServiceBase子类中,我有以下内容:

[DllImport("RTSSd.dll")]
public static extern int runRTS(string serviceName);

protected override void OnStart(string[] args)
{
  try
  {
    // the bin …
Run Code Online (Sandbox Code Playgroud)

c c# windows dll service

6
推荐指数
1
解决办法
3811
查看次数

使用 pinvoke 时,仅提供 dll 名称时,dll 的基本路径是什么?

我正在从 c# 调用以下内容:

[DllImport("u3dapi10.dll", CharSet=CharSet.Auto)]
public static extern uint dapiCreateSession(out uint hSession);
Run Code Online (Sandbox Code Playgroud)

.NET 在哪里寻找 u3dapi10.dll 文件?这以前有效,但现在我收到了 DLLNotFoundException。

u3dapi10.dll 文件在项目的根目录下。我尝试将它复制到 bin/debug 目录只是为了看看会发生什么,但它也找不到它。

可能的原因:这可能是由于 u3dapi10.dll 不兼容 64 位造成的吗?例如,如果您尝试从 64 位计算机访问 32 位 dll,是否会抛出 DllNotFoundException?或者它会在加载 32 位 DLL 时按照 BadImageFormatException 的建议抛出 BadImageFormatException ,目标是 x86

c# pinvoke dllimport

6
推荐指数
1
解决办法
2813
查看次数

当所需DLL的名称可能发生变化时,如何在运行时选择DllImport的路径?

我今天问了这个问题,但它被错误地关闭了,我无法选择重新打开它。因此,我不得不再问一遍。

我有一个类,其中有一长串定义,如下所示:

[DllImport(NativeLibraryName, EntryPoint = "FunctionName", CallingConvention = CallingConvention.Cdecl)]
public static extern void FunctionName();
Run Code Online (Sandbox Code Playgroud)

参数“NativeLibraryName”由编译器开关设置。但是,我想在运行时设置此参数。我的问题是,我需要考虑两种不同的 DLL:一种用于 32 位系统,一种用于 64 位系统,并且它们的名称不同。我想要实现的是确定应用程序是否以 64 位或 32 位运行并使用正确的 DLL。我需要加载正确的 DLL,否则我会遇到 BadImageFormatExceptions。

切换为代表

我可以使用 Reflection 生成一个文件,其功能与使用像这样的委托给出的文件相同。在这里,我可以在运行时提供正确的 DLL 的路径。

重命名 DLL

我还可以重命名这两个 DLL,使它们具有相同的名称,但将它们放在不同的目录中。然后我可以选择要从中加载 DLL 的文件夹。

这两个选项都可以正常工作,但我正在处理的项目是现有项目的一个分支,我希望尽可能少地进行更改,以便我可以轻松地将原始项目的更新合并到我的项目中。

我很高兴你的任何想法。

该线程被错误地建议作为我的问题的解决方案,并且原始线程在那之后被关闭。该线程讨论了类似的问题,但它没有提供适用于我的问题的解决方案。事实上,实际上提出了我自己想出的解决方案之一,但我正在寻找更好的方法来做到这一点。

c# dllimport loadlibrary

1
推荐指数
1
解决办法
2107
查看次数

标签 统计

c# ×3

dllimport ×2

c ×1

dll ×1

loadlibrary ×1

pinvoke ×1

service ×1

windows ×1