65.9K
CodeProject 正在变化。 阅读更多。
Home

探索通过多层多语言隧道设备生成确定性素数的可能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.99/5 (27投票s)

2010年4月1日

CPOL

2分钟阅读

viewsIcon

92509

downloadIcon

132

本文是 Nish Sivakumar、Cuthbert Calculus 教授和 Glenn Quagmire 共同进行的一项研究的总结。

本文是为 2010 年愚人节写的玩笑。建议读者不要太认真对待本文的内容。

引言

本文是 Nish Sivakumar、Cuthbert Calculus 教授和 Glenn Quagmire 共同进行的一项研究的总结。本文描述了通过多层多语言隧道装置生成确定性素数的探索性研究。示例代码保持足够简单,以便专注于我们试图解决的根本问题。核心在于,我们首先从一个内联汇编方法开始,该方法由导出的 C 函数使用,包装并导出为一个 C++ 类,然后通过 C++/CLI 包装器被 CLR 使用和公开,然后由 C# COM DLL 使用,该 DLL 公开一个通过 VBScript 使用并通过命令脚本执行的接口。

内联汇编

int GenerateIndex(int num)
{
  _asm
  {
    mov eax, dword ptr [num]
    xor edx, edx
    mov ecx, 3
    idiv ecx
    mov eax, edx
  }
}

这是核心随机化代码,它使用汇编语言是为了保持简单和轻量。 在示例中,我们将缓存的素数数量限制为 3,因此代码中使用了除数。

C DLL 导出

int __stdcall DllMain()
{ 
  return 0;
}

int primes[] = { 29, 37, 61 };

__declspec(dllexport) int GetDetPrime()
{
  return primes[GenerateIndex(GetTickCount())];
}

C DLL 本质上导出一个简单的函数,该函数返回一个确定性素数,并且代码在内部将随机化逻辑委托给汇编代码。 此时,任何能够调用 C DLL 的框架或层都可以使用该库。

C++ 类导出

// The header file
class __declspec(dllexport) CDetPrimeLib 
{
public:
  int GetDetPrime();
};

// Implementation file
#pragma comment(lib, "DetPrime.lib")

extern "C" __declspec(dllimport) int GetDetPrime();

int CDetPrimeLib::GetDetPrime()
{
  return ::GetDetPrime();
}

在这里,我们包装 C DLL 并将其导出为 C++ 类,以本机方式支持世界上最流行的编程语言。这是一个非常薄的包装器,因为我们不想在此时添加任何开销。

使用 C++/CLI 的 CLI 包装器

#pragma once

#pragma comment(lib, "DetPrimeLib.lib")

class __declspec(dllimport) CDetPrimeLib 
{
public:
  int GetDetPrime();
};

namespace DetPrimeManWrap 
{
  public ref class DetPrimeManaged
  {
    CDetPrimeLib* pNative;

  public:
    DetPrimeManaged()
    {
      pNative = new CDetPrimeLib();
    }

    ~DetPrimeManaged()
    {
      this->!DetPrimeManaged();
    }

    !DetPrimeManaged()
    {
      delete pNative;
    }

    int GetDetPrime()
    {
      return pNative->GetDetPrime();
    }
  };
}

虽然我们已经提供了足够的 API 公开,可以被认为是主流的,但直接支持 .NET 也很有意义,因此我们有一个 C++/CLI 包装器库,可将功能公开给托管调用者。

使用 C# 的 COM 包装器

[assembly: ComVisible(true)]
[assembly: Guid("6b4bf847-a45d-4f87-ba53-0d4a9fffa975")]
[assembly: AssemblyVersion("1.0.1.1")]
[assembly: AssemblyFileVersion("1.0.1.1")]

namespace DetPrimeCOM
{
    using DetPrimeManWrap;

    [Guid("18535B5E-0561-4BA8-8CF6-85B148F3A4CF")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IDetPrime
    {
        int GetDetPrime();
    }

    [Guid("2299461C-1FFB-4D5D-A521-0830F93FB5CC")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class DetPrime : IDetPrime
    {
        public int GetDetPrime()
        {
            return new DetPrimeManaged().GetDetPrime();
        }
    }
}

既然我们支持 .NET,我们不妨也支持 COM,这就是上面的 C# 代码所做的。 该代码现在已准备好用于 COM 使用。

VBScript 调用者

Dim detPrime 
Set detPrime = CreateObject("DetPrimeCOM.DetPrime")
Wscript.Echo "The generated Deterministic Prime is " & detPrime.GetDetPrime

VB6 现在已正式消亡,因此我们求助于一个简单的 VBScript 脚本来调用 COM 库。

命令脚本

@%windir%\syswow64\cscript.exe /nologo DetPrime.vbs

我们架构中的最后一部分是命令脚本,它通过 cscript.exe 执行 VBScript,以便我们可以在 64 位操作系统上运行它,即使该代码是 32 位的,以支持绝大多数框架。

结论

本文是为 2010 年愚人节写的玩笑。建议读者不要太认真对待本文的内容。

© . All rights reserved.